【问题标题】:Sonar coverage report for PowerMockitoPowerMockito 的声纳覆盖率报告
【发布时间】:2021-07-06 21:46:49
【问题描述】:

我正在为我的测试类使用 PowerMockito 和 @PrepareForTest 注释。当我这样做时,Sonar 说没有一个分支被覆盖。但是,我的其他不使用 PowerMockito 的测试类运行良好。这是我的 pom 的样子

<dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-api-mockito</artifactId>
            <version>1.6.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-module-junit4</artifactId>
            <version>1.6.2 </version>
            <scope>test</scope><plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
                <version>3.2</version>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.6.201602180812</version>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default-report</id>
                        <!-- <phase>prepare-package</phase> -->
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
        </dependency>

我需要在这个 pom 中添加什么吗? 任何帮助表示赞赏,在此先感谢

【问题讨论】:

标签: java spring-boot sonarqube


【解决方案1】:

是的,powermock 在第一步中不适用于声纳,问题的原因是 powermock 和 jacoco 的组合, 已经存在与此问题相关的问题 (https://github.com/powermock/powermock/issues/727),请参阅此处了解更多信息:

https://github.com/powermock/powermock/wiki/Code-coverage-with-JaCoCo

与此同时,您可以尝试一种解决方法,如下所述:

https://www.geekality.net/2013/09/12/maven-package-runtime-dependencies-in-lib-folder-inside-packaged-jar/

【讨论】:

    【解决方案2】:
    • PowerMock 第一步不支持 sonar,问题的原因是 powermock 和 jacoco 的组合
    • 我们本地不会遇到这个问题,但是如果我们使用sonar进行测试覆盖率计算,报错如下
    Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null) 
    
    • 在 PowerMock 2.0.9 版本中,提供了解决此问题的方法,前提是他们添加了注释 @PrepareOnlyThisForTest,这提供了隔离特定测试类的能力。
    • 除此之外,我们还需要使用 @PowerMockRunnerDelegate(SpringRunner.class) 将 Runner 委托给 SpringRunner

    在 pom.xml 中添加 Power Mock 依赖项

            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-module-junit4</artifactId>
                <version>2.0.2</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-api-mockito2</artifactId>
                <version>2.0.9</version>
                <scope>test</scope>
            </dependency>
    

    为测试类使用 PowerMock Junit Runner 并声明我们正在模拟的测试类并委托 SpringRunner

        @RunWith(PowerMockRunner.class)
        @PrepareOnlyThisForTest(ServiceApplication.class)
        @PowerMockRunnerDelegate(SpringRunner.class)
        public class ExampleControllerTest {
            PowerMockito.mockStatic(ServiceApplication.class);
            Mockito.when(ServiceApplication.getStatic()).thenReturn("");
    

    【讨论】:

      【解决方案3】:

      我发现如果您在 @PrepareForTest 注释中只有一个类,例如 @PrepareForTest(ClassA.class) 然后 jacoco 覆盖工作。仅当有多个类时,例如@PrepareForTest({ClassA.class, ClassB.class}) jacoco 覆盖率报告为 0%

      【讨论】:

        【解决方案4】:

        您只需将 Runner 的委托添加到 SpringRunner;

        @RunWith(PowerMockRunner.class)
        @PowerMockRunnerDelegate(SpringRunner.class)
        

        【讨论】:

        • 为什么有人认为每个 Java 问题都与 Spring 相关?春天之外还有一整个世界,作者根本没有提到春天。
        猜你喜欢
        • 2013-09-26
        • 2012-07-18
        • 2016-08-04
        • 2019-11-01
        • 2020-03-10
        • 2015-03-11
        • 2012-10-05
        • 2017-02-11
        • 2017-10-25
        相关资源
        最近更新 更多