2012-03-15 129 views
11

我在Eclipse中使用EclEmma来帮助我知道我的项目中缺少代码测试的位置,但是所有与@RunWith(PowerMockRunner.class)的测试都未被调用,因此未经测试。为什么EclEmma没有使用@RunWith(PowerMockRunner.class)测试覆盖代码

我正在使用JUnit 4.8.1和Mockito。

它可能是什么?

+1

你能否提供像Mockito,PowerMock和EclEmma这样的更多细节? – Brice 2012-03-16 00:12:45

+0

嘿,我在eclEmma 1.5.x中使用eclEmma的版本2.1.0,它是该版本中的一个bug,它显示的测试覆盖率很高。 – LottaLava 2012-03-19 19:35:42

+0

好的,从版本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

回答

0

AFAIK eclEmma以及许多其他覆盖系统,修改您的.class文件以添加覆盖指令。大多数这些工具在“编译时”执行,而不是在运行时执行。

PowerMock代替,还有的AspectJ LTW和许多其他系统,操作同样的字节码,但在“运行时间”:

PowerMock是一个框架,扩展其他模拟库,如EasyMock的具有更强大的能力。 PowerMock使用自定义类加载器和字节码操作来模拟静态方法,构造函数,最终类和方法,私有方法,删除静态初始化器等等。

我有两个eclEmma(各种版本)和的Cobertura类似的问题在使用AspectJ LTW,导致组合时的.class文件在运行时修改发生,它在某种程度上破坏由覆盖工具以前做的修改。

我还没有找到解决方案,但至少找到了症状。

正确的解决方案是调试PowerMock工具并找出它在哪里以及如何打破覆盖工具。这是一个相当的问题,对于一个测试工具,打破覆盖工具,因为两者经常一起使用:)

0

我们有一个静态类嘲笑。通过模仿静态类,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行进行评论。

相关问题