【问题标题】:Does JMockit have any drawbacks at all?JMockit 有什么缺点吗?
【发布时间】:2011-02-28 05:12:15
【问题描述】:

comparison 表明,JMockit 与其他框架相比有几个优势。

与 JMockit 相比,其他其中之一(JMock、EasyMock、Mockito、Unitils、PowerMock + Mockito/EasyMock)是否还有任何优势?

【问题讨论】:

    标签: java unit-testing jmock jmockit mockito


    【解决方案1】:

    我最近采用了一个使用 JMockit 的项目,我认为由于库能够模拟静态和私有方法,代码的质量肯定会受到影响。

    测试非常脆弱,因为包含在私有方法中的实现细节正在被测试(所以如果我改变 如何 类做某事它可能会破坏测试,即使 what班级确实没有受到影响)。

    代码中还充斥着对静态方法的调用——如果开发人员没有能力模拟这些方法,那么我认为他们会付出更多努力来更好地解耦。

    【讨论】:

    • 我不明白这条评论。您说使用 JMockit b/c 后测试变得脆弱,私有方法中的实现细节已测试。但是,模拟这种私有方法的能力确实应该帮助您通过实际模拟这些私有方法而不是通过测试私有方法来加剧问题?那么,JMockit 不是让你的测试比没有它更好吗?只是好奇。
    • 我认为测试很脆弱,因为如果有人重构一个类(例如重命名/分解/组合一些内部方法,或者甚至完全改变类内部的工作方式而不更改其公共 API),那么在类内部测试其私有方法的测试会中断。我认为单元测试不应该关心一个类如何完成它的工作,它应该只关心工作是否正确完成。是不是更清楚了?
    • 啊,是的。感觉就像this 评论与您的​​观点相同。干杯!
    • @BhabaniSankarMishra 不,测试不应该仅仅因为代码更改而失败,如果代码停止正常运行,它们应该会失败。
    • 我从来没有说过代码更改,更改通常是从业务角度来看的。编写测试的重点是确保更改安全,如果测试没有失败,那么编写测试的意义何在。
    【解决方案2】:

    三个缺点:

    • 您必须使用 Java 代理来执行字节码检测。
    • 您不能使用 Eclipse 附带的签名 junit.jar 文件。
    • 您必须学习模拟 API。 (与存根对象相反)

    您总是可以讨论能够像 JMockit 那样模拟最终类是否是一件好事。除非是遗留代码,否则重构通常是更好的选择。

    对于像 Eclipse 这样的 IDE,我发现自己使用工具支持在测试类中生成存根比最近的模拟(JMockit、Mockito 等)更频繁。这种方法的优点是非常简单。当您的团队中有许多开发人员并且其中一些人不喜欢测试并且没有学习模拟框架的动力时,这尤其好。此外,存根实现没有框架限制!

    如果您愿意将存根作为替代方案,您应该查看 Robert C. Martin 关于模拟和存根的博客 here 和 here

    否则,它看起来很不错!虽然我只有 JMock、EasyMock 的经验和 JMockit 的基本知识。

    【讨论】:

    • 是的,我也在问自己,我想在嘲笑方面走多远。我自己的代码自始至终都使用依赖注入,因此模拟并不是一项真正复杂的任务(尽管由于与 GWTRPC 一起使用时增加的维护工作和性能开销,我并不总是对所有事情都使用接口)。当您说您使用工具支持在 Eclipse 中生成存根时,您想到了哪些工具?
    • 只是 Eclipse 中的核心 Java 支持。例如,如果您创建一个私有或匿名类来实现您想要存根的接口,那么 Eclipse 可以创建一个框架实现。选择类后只需单击 + 1。
    • 1) “必须使用 Java 代理”到底是什么意思? (“-javaagent”参数在 JDK 1.6 中是可选的。) 2) 更正已签名的 JUnit jar,但使用“真正的”JUnit 就像“用户库”一样容易。 3)当然你必须学习一个模拟API!该比较矩阵中的所有其他模拟/存根 API 也是如此……您的意思是什么?
    • @Rogerio:JMockit 非常棒,而且很有可能有一天我会使用它。是否会有 JMockit 文档的缩写版本? (提示:关于 Mockito 的所有重要知识都可以在不到两个小时的时间内学会……)也许连同定义 JMockit 功能的一个子集,这些功能被标记为“对良好设计是安全的”(这包括模拟最终方法顺便说一句!)帮助,因为如果我们可以测试所有内容,就很难说服团队成员(或者 - 恐怕 - 甚至我自己)编写好的、可重用的代码而没有隐藏或不必要的依赖!
    • @Rogerio:请记住,作为 JMockit 的作者,您不能完全客观。作为一个模拟专家,你在模拟方面会比一个对 Java 相对较新的开发人员有更好的结果。无论如何,这是我对这篇文章的最后评论。我将进一步关注 JMockit,并且很可能在我的下一个项目中使用它。到目前为止,我对 JMockit 的印象非常好! Crhis 和我所写的绝对没有关于 JMockit 中的不良功能或 API。它是关于模拟与存根以及与许多不同技能水平的开发人员一起在代码上实现良好设计的策略。
    猜你喜欢
    • 2011-04-26
    • 2011-11-05
    • 2015-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 2011-05-22
    相关资源
    最近更新 更多