我们正在使用EasyMock和PowerMock和JUnit。使用的覆盖工具是ECLEmma。使用EasyMock,它以绿色显示正确的覆盖范围(如图所示)。但是,对于使用PowerMock进行单元测试的代码,覆盖率显示为红色(未覆盖)。在网上看过类似的问题。但是,只是想检查是否有解决方案。
感谢
卡塔斯
答案 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)
答案 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
语句考虑在内:
如果要模拟new
语句,请确保使用PowerMockRule
而不是PowerMockRunner
。
答案 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
文件。您可以在此处找到覆盖率信息。