【问题标题】:Mock private/ static methods with jmockit使用 jmockit 模拟私有/静态方法
【发布时间】:2017-03-23 10:30:19
【问题描述】:

我尝试使用 jmockit 1.18 模拟静态方法,但我担心代码覆盖率。我得到的错误是:

java.lang.instrument.IllegalClassFormatException: 出错时 检测类 org/junit/runner/notification/RunNotifier

我正在使用 jacoco agent 0.6.3.201306030806EclEmma core 2.2.1.201306092145

【问题讨论】:

    标签: java unit-testing junit jacoco jmockit


    【解决方案1】:

    JaCoCo 的旧版本(0.7.3 之前 - 在链接页面中搜索“jmockit”)会与其他字节码修改工具(例如 JMockit)发生冲突。

    所以,如果你将 EclEmma 升级到使用 JaCoCo 0.7.3+ 的版本应该没问题。

    另一方面,IllegalClassFormatException 指向 JUnit 的 RunNotifier 类,JMockit 在运行时修改(出于集成目的),但 JaCoCo 不应该修改。因此,您可能需要从 JaCoCo 检测中排除此类类(请参阅 JaCoCo/EclEmma 文档)。

    【讨论】:

      【解决方案2】:

      我担心代码覆盖率

      您几乎可以在任何允许模拟private/final 类和static/private/final 成员的模拟框架中体验到这一点。原因是模拟框架在实际测试的运行时改变了字节码,而覆盖工具在开始之前改变了字节码。测试。

      更好的方法是更改​​您的代码,使其不使用对成员的静态访问,并且不创建方法final(通常)。此外,如果您正确实施关注点分离单一职责、单层抽象*和依赖注入,您的编写工作会更轻松测试...

      【讨论】:

      • 而不是 1) 对一些技术问题的原因做出疯狂的假设,2) 建议开发人员将他们的代码弯曲到特定测试工具的限制,3) 推广糟糕的设计(因为正确使用 @987654327 @ 在良好的 API 设计中很重要 - 例如,请参阅“Effective Java”一书),以及 4)抛出流行语,您也许实际上可以尝试为手头的问题提供正确且有用的答案(例如,请参阅我的答案)。 ..
      • @Rogério 1) 你能证明我错了吗? 2) 通常,当您在测试代码时遇到问题时,随着程序的增长,您通常在重用/修改代码时也会遇到问题。顺便说一句:你没有做同样的事情(但对于测试代码)? 3) 只有少数情况下 final 是 正确 使用。即使通过“有效的java”,没有特定原因将它放在任何地方都是不正确的。 4) 它充分说明了您认为重要的 OO 原则是“流行语”。
      • 1) 是的,我可以证明你错了,只需指出 JMockit 和 JaCoCo 在最近的版本中可以很好地协同工作(据我所知)。换句话说,这两个工具都“在运行时更改字节码”这一事实并不意味着它们不能一起工作。
      • 2) 是的,可测试性(易于测试)与可维护性(易于修改/发展代码)基本相同。但是易于测试与 finalprivatestatic 的方法无关,或者与直接用 new 实例化的对象无关,而不是被注入。
      • 3) 不。在良好的 API 设计中(另请参阅“实用 API 设计”和“C++ 的 API 设计”书籍),您将 大多数 类声明为 final,因为它们不会被设计为用作基类。而在设计基类时,通常需要将protectedpublic 方法设为final(例如,在应用GoF 书中的“模板方法”模式时)。而“Effective Java”在第 17 项中提到“为继承设计和记录,否则禁止它”(意思是默认将类设为 final)。
      猜你喜欢
      • 2013-07-14
      • 1970-01-01
      • 2020-05-26
      • 2015-08-22
      • 2014-12-12
      • 2016-05-22
      • 2014-08-17
      • 1970-01-01
      相关资源
      最近更新 更多