2017-03-03 72 views
2

我正在使用Powermock,但是当我运行Eclemma覆盖时,由于EclEmma的已知问题,Powermock测试用例未在最终得分中考虑。EclEmma,powermock和Java 7问题

此,我搜索和计算器其他答案建议有周围的工作:

@Rule 
public PowerMockRule rule = new PowerMockRule(); 

static { 
PowerMockAgent.initializeIfNeeded(); 
} 

然后添加像powermock模块-javaagent罐,powermock模块-junit4规则代理。

这样做,当我运行我的代码,然后发现错误后:

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测试用例得分?

回答

2

我最喜欢的非答案:不要浪费你的时间尝试。

取而代之的是另一个暗示PowerMock不应该被使用;并利用您的时间和精力来学习如何编写更好的生产代码,这些代码可以在不需要PowerMock的情况下进行测试。

例如,开始寻找那些videos;了解代码,避免拨打电话静态(在一个不可测试的)方式很经常不好代码;并且改进此代码不仅可以帮助您摆脱PowerMock,还可以改进您的所有产品。

而且如果你发现离开PowerMock很难;我的建议是:然后把你的测试分为两个桶(其中一个用于真正使用PowerMock仅用于PowerMock所能做的事情;另一个用于所有其他)。只测量后者的覆盖范围。这也将打开一条“前进之路”:只要避免使用PowerMock来处理任何新事物。相反,你可以转向mockito,这在过去几年中已经有所改善;甚至可以让你的东西(实验)像重写最终方法一样。

0

我想出了一个办法,可能不干净,但我认为它的工作。
所以问题陈述是如何让Powermock获得EclEmma?
在方法的第一个变化是招Eclemma的行家做法即jacoco
请随时移动到答案之前必须通过下面的链接:

Power mock with jacoco
Basic of Java Instrumentation

简而言之,jacoco标识代码覆盖范围为锁定/更新字节码/仪器类,当被加载时
并为其工作的powermock也锁定/更新字节码/仪器类其功能,但它是从磁盘而不是内存
因此,当覆盖率由jacoco给出时,powermock类不会被覆盖,powermock会从磁盘文件运行测试用例,而jacoco不知道powermock正在做什么。
所以围绕它来存储由磁盘上的jacoco检测的类,然后powermock的工作将通过这些类进行测试,这些类将反过来让jacoco知道测试正在运行并将它们包含在代码覆盖中。
[PLS随时纠正我的理解。有关本]
所以最终的代码更改为:后

<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摸索出适合我。