我正在使用PowerMock,但是当我运行Eclemma覆盖范围时,由于Eclemma的已知问题,在最终分数中未考虑PowerMock测试用例。
我搜索的工作和stackoverflow上的其他答案建议:
@Rule
public PowerMockRule rule = new PowerMockRule();
static {
PowerMockAgent.initializeIfNeeded();
}
然后添加罐子,例如PowerMock-Module-Javaagent,PowerMock-Module-Junit4-Rule-agent。
在运行代码时执行此操作后,然后找到错误:
java.lang.VerifyError: Expecting a stackmap frame at branch target 7
为此,答案表明具有各种版本的Javassit。但是我无法得到这项工作并获得相同的错误。
我的pom.xml看起来像:
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-javaagent</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4-rule-agent</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.21.0-GA</version>
<scope>test</scope>
</dependency>
我如何获得最终eclemma分数中的PowerMock测试用例?
我最喜欢的非答案:不要浪费时间尝试。
相反,将其作为另一个提示不应使用PowerMock;并利用您的时间和精力来学习如何编写无需Powermock而可以测试的更好的生产代码。
例如,开始研究这些视频;了解避免调用 static 或 new (以无法测试的方式)的代码通常是 bad 代码;改进此代码不仅可以帮助您摆脱PowerMock,还可以改善所有产品。
,如果您发现将PowerMock留给Hard;我的建议:然后将您的测试放入两个 bucket(一个用于真正使用PowerMock的人只能做PowerMock可以做的事情;一个用于所有其他功能);并且仅测量后来的覆盖范围。这也将打开"前进道路":只需避免将PowerMock用于您的任何新事物。取而代之的是,您可以转向Mockito,这在过去几年中有了很多改善。甚至允许您(实验)等最终方法(实验)。
我想出了一种方法,可能不是干净,但我认为它可以解决。
,问题陈述是如何将PowerMock包含在Eclemma中?<<<<<<<</strong>。
接近的第一个更改是转到eclemma的Maven方法,即 jacoco
请随时通过下面的链接,然后移动答案:
用jacoco
爪哇仪器的基础
简而类用于其功能,,但它是从磁盘而不是内存的。
因此,当Jacoco给出覆盖范围时,PowerMock类未覆盖,因为PowerMock从磁盘文件中运行测试用例,而Jacoco不知道PowerMock在做什么。
因此,围绕它的工作将jacoco仪器的类存储在磁盘上,然后PowerMock通过那些课程进行测试,而这些课程又会让Jacoco知道测试正在运行并将其包括在代码覆盖范围中。
[请随时纠正我对此的理解]
因此,最终代码更改为:
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>org.jacoco.agent</artifactId>
<version>0.7.7.201606060606</version>
<classifier>runtime</classifier>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.6.1</version>
<scope>test</scope>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<configuration>
<excludes>
// files you want to exclude
</excludes>
</configuration>
<executions>
<execution>
<id>default-instrument</id>
<goals>
<goal>instrument</goal>
</goals>
</execution>
<execution>
<id>default-restore-instrumented-classes</id>
<goals>
<goal>restore-instrumented-classes</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>${project.build.directory}/coverage.exec</dataFile>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<jacoco-agent.destfile>${project.build.directory}/coverage.exec</jacoco-agent.destfile>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
在此运行后-PcodeCoverage为我解决了。