繁体   English   中英

为什么EclEmma没有使用@RunWith(PowerMockRunner.class)进行测试的覆盖代码

[英]Why EclEmma doesn't coverage code with tests with @RunWith(PowerMockRunner.class)

我正在使用EclEmma和Eclipse来帮助我知道我的项目中缺少代码测试的地方,但所有使用@RunWith(PowerMockRunner.class)测试都没有被调用,因此没有经过测试。

我正在使用JUnit 4.8.1和Mockito。

会是什么呢?

它为双方报告了一个已知错误:

http://code.google.com/p/powermock/issues/detail?id=402 https://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仪器并找出它在何处以及如何打破覆盖工具。 对于测试工具来说,打破覆盖工具是一个很大的问题,因为两者经常在一起使用:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM