我在Eclipse中使用EclEmma来帮助我知道项目中缺少代码测试的地方,但是@RunWith(PowerMockRunner.class)
的所有测试都没有被调用,因此没有经过测试。
我正在使用JUnit 4.8.1和Mockito。
它可能是什么?
答案 0 :(得分:3)
为双方报告了一个已知错误:
http://code.google.com/p/powermock/issues/detail?id=402 https://github.com/jacoco/eclemma/issues/15#issuecomment-9565210
然而,eCoberture似乎提供了正确的报道。唯一的问题是,它似乎不再被维护了,你无法删除Eclipse Juno中的亮点。
答案 1 :(得分:1)
在这里,您可以找到有效的示例,可以帮助您解决此问题 https://github.com/Godin/jacoco-experiments
使用mvn clean package
查看jacoco报告
答案 2 :(得分:1)
我们有一个静态类来模拟。使用模拟静态类,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行。
答案 3 :(得分:0)
AFAIK eclEmma以及许多其他覆盖系统会修改.class文件以添加覆盖说明。大多数这些工具在“编译时”执行此操作,而不是在运行时。
PowerMock以及AspectJ LTW和许多其他系统在“运行时”操作相同的字节码:
PowerMock是一个框架,可以扩展其他模拟库,例如EasyMock,具有更强大的功能。 PowerMock使用自定义类加载器和字节码操作来模拟静态方法,构造函数,最终类和方法,私有方法,删除静态初始化器等等。
我在eclEmma(各种版本)和Cobertura与AspectJ LTW结合时遇到了类似的问题,因为当.class文件的运行时修改发生时,它会以某种方式破坏覆盖工具之前完成的修改。
我还没有找到解决方案,但至少找到了症状。
正确的解决方案是调试PowerMock仪器并找出它打破覆盖工具的位置和方式。对于测试工具来说,打破覆盖工具是一个很大的问题,因为这两者经常在一起使用:)