PowerMock ECLEmma覆盖问题

时间:2014-04-29 11:19:54

标签: java junit easymock


我们正在使用EasyMock和PowerMock和JUnit。使用的覆盖工具是ECLEmma。使用EasyMock,它以绿色显示正确的覆盖范围(如图所示)。但是,对于使用PowerMock进行单元测试的代码,覆盖率显示为红色(未覆盖)。在网上看过类似的问题。但是,只是想检查是否有解决方案。

感谢
卡塔斯

8 个答案:

答案 0 :(得分:12)

是的,有一个解决方案:

首先,您必须添加此maven依赖项:

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4-rule-agent</artifactId>
  <version>1.6.4</version>
  <scope>test</scope>
</dependency>

然后,不要使用这个注释@RunWith(PowerMockRunner.class),只需在Test类中添加一个@Rule,如下所示:

public class Test {

   @Rule
   public PowerMockRule rule = new PowerMockRule();

您可以在此博客中找到更多内容Make EclEmma test coverage work with PowerMock

答案 1 :(得分:10)

这是一个已知问题:https://github.com/jayway/powermock/issues/422

它已经很长一段时间了,不会很快修复。

我建议你改用eCobertura

答案 2 :(得分:5)

这在大多数情况下都适用于我的项目:

@Rule
public PowerMockRule rule = new PowerMockRule();
static {
    PowerMockAgent.initializeIfNeeded();
}

删除/评论@RunWith(PowerMockRunner.class)&amp;在类路径中添加powermock-module-javaagent-1.6.5.jar后包含以下导入:

import org.junit.Rule;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.powermock.modules.agent.PowerMockAgent;

现在右键单击 - &gt;覆盖范围As-&gt;覆盖配置并在参数中添加以下行:

-ea -noverify -javaagent:path/to/powermock-module-javaagent-1.6.5.jar

点击应用 - &gt;覆盖范围。

另请注意,@Before在这种情况下不起作用,因此您必须在标有@Test的方法中添加标有@Before的方法中的所有内容。

答案 3 :(得分:2)

我们有一个静态类来模拟。使用模拟静态类,eclEmma代码覆盖插件在Eclipse中不起作用。所以我们做的是,在课堂上放置@RunWith(JUnit4.class)(而不是@RunWith(PowerMockRunner.class))并在课程中放置以下行

static {
PowerMockAgent.initializeIfNeeded();
}

@Rule
public PowerMockRule rule = new PowerMockRule();

编译该类并运行测试类。代码覆盖范围适用于课程。此更改仅在Eclipse IDE中进行。

编写测试用例后,我们将代码恢复正常。放置@RunWith(PowerMockRunner.class)而不是@RunWith(JUnit4.class),并在上面注释静态代码和powermockrule行。

答案 4 :(得分:1)

我已经成功使用powermock-module-javaagent通过Jacoco生成了PowerMock报道。

只需确保将Powermock代理放在 jacoco代理之后:

<artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <useSystemClassLoader>true</useSystemClassLoader>
                <argLine>${jacocoArgLine} -javaagent:${settings.localRepository}/org/powermock/powermock-module-javaagent/${powermock.version}/powermock-module-javaagent-${powermock.version}.jar -noverify</argLine>
...

如果要查看示例,请查看以下项目:https://github.com/jfcorugedo/sonar-scanner

在这里您可以看到声纳将静态方法和PowerMock模拟的new语句考虑在内:

enter image description here

如果要模拟new语句,请确保使用PowerMockRule而不是PowerMockRunner

看看this test

答案 5 :(得分:0)

更新powermock版本修复,下面的问题是受支持版本的maven依赖性

<dependency>
   <groupId>org.powermock</groupId>
   <artifactId>powermock-module-junit4-rule-agent</artifactId>
   <version>1.7.3</version>
   <scope>test</scope>
</dependency>

希望这会有所帮助!

答案 6 :(得分:0)

我面临着同样的问题。因此,我更新了powerMockito版本。现在,我正在使用Power模拟1.7.4版和Jacoco 0.8.5版。它甚至还可以在Eclipse上运行。

答案 7 :(得分:-1)

对于模拟静态类,使用@RunWith(PowerMockRunner.class)并在Eclipse上运行“作为JUnit测试的覆盖”确实显示了未覆盖的代码,显然这似乎是一个问题。

要添加到上述解决方案中,请在maven项目中尝试一下。

在根pom.xml中,为生成报告,将html添加为cobertura-maven-plugin的格式。下面是它的外观。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>cobertura-maven-plugin</artifactId>
    <configuration>
       <formats>
          <format>html</format>
          <format>xml</format>
       </formats>
    </configuration>
</plugin>

然后,转到您的类所在的模块,并在Eclipse Web Browser中或您选择的一个中打开target/site/cobertura/index.html文件。您可以在此处找到覆盖率信息。