我在Eclipse中使用EclEmma来帮助我了解项目中缺少代码测试的地方,但使用@RunWith(PowerMockRunner.class)
的所有测试都没有被调用,因此没有进行测试。
我将JUnit 4.8.1与Mockito一起使用。
可能是什么?
双方都报告了一个已知的错误:
http://code.google.com/p/powermock/issues/detail?id=402https://github.com/jacoco/eclemma/issues/15#issuecomment-9565210
然而,eCoberture似乎提供了正确的覆盖范围。唯一的问题是,它似乎不再被维护,并且您无法删除Eclipse Juno中的亮点。
在这里,您可以找到有效的示例,并可以帮助您解决此问题https://github.com/Godin/jacoco-experiments
使用mvn clean package
查看jacoco报告
我们有一个要模拟的静态类。通过模拟静态类,eclEmma代码覆盖插件在Eclipse中不起作用。所以我们所做的是,在类之前放置@RunWith(JUnit4.class)(而不是@RunWith(PowerMockRunner.class)),并在类内放置以下行
static {
PowerMockAgent.initializeIfNeeded();
}
@Rule
public PowerMockRule rule = new PowerMockRule();
编译类并运行测试类。代码覆盖率对类来说运行良好。此更改只是为了在Eclipse IDE中运行eclEmma插件而没有任何问题。
编写完测试用例后,我们将代码恢复到正常状态。放置@RunWith(PowerMockRunner.class)而不是@RunWith(JUnit4.class),并在静态代码和powermockrule行上方进行了注释。
AFAIK-eclEmma以及许多其他覆盖系统,可以修改.class文件以添加覆盖说明。这些工具中的大多数都是在"编译时"完成的,而不是在运行时。
PowerMock,以及AspectJ LTW和许多其他系统,在"运行时"操作相同的字节码:
PowerMock是一个框架,它以更强大的功能扩展了EasyMock等其他模拟库。PowerMock使用自定义类加载器和字节码操作来实现对静态方法、构造函数、最终类和方法、私有方法、静态初始化程序的移除等的模拟。
我对eclEmma(各种版本)和Cobertura以及AspectJ LTW都有类似的问题,因为当.class文件的运行时修改发生时,它会以某种方式破坏覆盖工具之前所做的修改。
我还没有找到解决方案,但至少找到了症状。
正确的解决方案是调试PowerMock工具,并找出它在哪里以及如何破坏覆盖工具。对于测试工具来说,破坏覆盖率工具是一个相当大的问题,因为这两者经常一起使用:)