我在Eclipse中使用EclEmma来帮助我知道我的项目中缺少代码测试的位置,但是所有与@RunWith(PowerMockRunner.class)
的测试都未被调用,因此未经测试。为什么EclEmma没有使用@RunWith(PowerMockRunner.class)测试覆盖代码
我正在使用JUnit 4.8.1和Mockito。
它可能是什么?
我在Eclipse中使用EclEmma来帮助我知道我的项目中缺少代码测试的位置,但是所有与@RunWith(PowerMockRunner.class)
的测试都未被调用,因此未经测试。为什么EclEmma没有使用@RunWith(PowerMockRunner.class)测试覆盖代码
我正在使用JUnit 4.8.1和Mockito。
它可能是什么?
AFAIK eclEmma以及许多其他覆盖系统,修改您的.class文件以添加覆盖指令。大多数这些工具在“编译时”执行,而不是在运行时执行。
PowerMock代替,还有的AspectJ LTW和许多其他系统,操作同样的字节码,但在“运行时间”:
PowerMock是一个框架,扩展其他模拟库,如EasyMock的具有更强大的能力。 PowerMock使用自定义类加载器和字节码操作来模拟静态方法,构造函数,最终类和方法,私有方法,删除静态初始化器等等。
我有两个eclEmma(各种版本)和的Cobertura类似的问题在使用AspectJ LTW,导致组合时的.class文件在运行时修改发生,它在某种程度上破坏由覆盖工具以前做的修改。
我还没有找到解决方案,但至少找到了症状。
正确的解决方案是调试PowerMock工具并找出它在哪里以及如何打破覆盖工具。这是一个相当的问题,对于一个测试工具,打破覆盖工具,因为两者经常一起使用:)
它是一种已知的bug报告的双方:
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行进行评论。
你能否提供像Mockito,PowerMock和EclEmma这样的更多细节? – Brice 2012-03-16 00:12:45
嘿,我在eclEmma 1.5.x中使用eclEmma的版本2.1.0,它是该版本中的一个bug,它显示的测试覆盖率很高。 – LottaLava 2012-03-19 19:35:42
好的,从版本2.x开始,似乎_EclEmma_不再使用_Emma_。他们正在使用自己的被称为JaCoCo的覆盖工具。由于我不知道您使用的PowerMock版本,您应该尝试PowerMock 1.4.11,其中包含一些与JaCoCo相关的修复:http://powermock.googlecode.com/svn/trunk/changelog.txt – Brice 2012-03-20 09:50:21