如果使用@PrepareForTest,Jacoco会错过所有覆盖范围

Mic*_*jan 9 java unit-testing mocking powermock jacoco

我遇到了一个有趣的问题,如果使用的话,Jacoco会报告单位测试下的0%覆盖率@PrepareForTest.

长话短说,我的单元测试是使用@RunWith(PowerMockRunner.class)@PrepareForTest(SomeStaticMethodClass.class)执行单元测试的组合,需要模拟静态方法.你可以阅读这两篇文章,我就嘲笑静态方法(发表文章1,2).模拟静态方法效果很好.不好的副作用是,当Jacoco使用@PrepareForTest注释运行单元测试时,任何测试的类单元都会被忽略,并且该类的Jacoco报告显示0%的覆盖率.我已经将问题专门针对@PrepareForTest注释.我这样做是通过创建一个简单的POJO单元测试,在该POJO上获得100%的覆盖率,然后在@PrepareForTest单元测试的注释中添加.在添加该注释后,Jacoco报告显示POJO覆盖率为0%.

所以任何人对此都有任何想法?

以下是一些技术信息:

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) Client VM (build 25.45-b02, mixed mode)

Apache Maven 3.0.4 (r1232337; 2012-01-17 02:44:56-0600)

<plugin>
  <groupId>org.jacoco</groupId> 
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.7.4.201502262128</version>
. . .
</plugin>


<plugin>
  <groupId>org.apache.maven.plugins</groupId> 
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.18.1</version>
  . . .
</plugin>


    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.5.6</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-easymock</artifactId>
        <version>1.5.6</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.5.6</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.easymock</groupId>
        <artifactId>easymock</artifactId>
        <version>3.2</version>
        <scope>test</scope>
    </dependency>


<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cobertura-maven-plugin</artifactId>
            <version>2.7</version>
        </plugin>
    </plugins>
</reporting>
Run Code Online (Sandbox Code Playgroud)