EclEmma, powermock and Java 7 issue



我正在使用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为我解决了。

相关内容

  • 没有找到相关文章

最新更新