Unable to get Jacoco to work with Powermockito using offline instrumentation

前端 未结 12 1704
醉梦人生
醉梦人生 2020-12-13 01:56

Given that Jacoco doesn\'t play nicely with PowerMockito when instrumenting \"on the fly\", I\'ve been trying to configure offline instrumentation in the hope this will give

相关标签:
12条回答
  • 2020-12-13 02:30

    The report is correct. The provided test leads to no coverage as you mock what happens when calling the method "say". One should never mock the "instance/class under test", only do this for the dependencies and surroundings of the test subject.

    In this case: The code return "hello:"+s; is never reached by the test and the constructor of Utils is not called. There is no coverage displayed as there is no test coverage of these lines at all.

    Nevertheless using JaCoCo and PowerMock together is not trivial. I am currently looking for how to get it to run, too. Maybe your provided test is just unluckily written and JaCoCo is already working as it should?

    0 讨论(0)
  • 2020-12-13 02:32

    I made it work using the javaagent of PowerMock. see here: https://github.com/powermock/powermock/wiki/PowerMockAgent

    Remove the @RunWith annotations, put the PowerMockRule as described in the link above. Make it public.

    Put the following line in the maven-surefire-plugin configuration:

    -javaagent:${org.powermock:powermock-module-javaagent:jar}
    

    (used the technique described here : Can I use the path to a Maven dependency as a property?)

    <?xml version="1.0" encoding="UTF-8"?>
    <project>
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.stackoverflow</groupId>
        <artifactId>q2359872</artifactId>
        <version>2.0-SNAPSHOT</version>
        <name>q2359872</name>
    
        <properties>
            <!-- Must be listed in the dependencies section otherwise it will be null. -->
            <my.lib>${org.jmockit:jmockit:jar}</my.lib>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.jmockit</groupId>
                <artifactId>jmockit</artifactId>
                <version>1.11</version>
            </dependency>
        </dependencies>
        <build>
            <defaultGoal>generate-sources</defaultGoal>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>2.3</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>properties</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <!-- Example usage: -->
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.2</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>exec</goal>
                            </goals>
                            <phase>generate-sources</phase>
                        </execution>
                    </executions>
                    <configuration>
                        <executable>echo</executable>
                        <arguments>
                            <argument>path to jar=</argument>
                            <argument>${org.jmockit:jmockit:jar}</argument>
                            <argument>my.lib=</argument>
                            <argument>${my.lib}</argument>
                        </arguments>
                    </configuration>
                </plugin>
                <!-- end of Example usage -->
            </plugins>
        </build>
    </project> 
    
    0 讨论(0)
  • 2020-12-13 02:33

    I ended up using offline instrumentation and Jacoco (similar to what you have done) in conjunction with sonar and I was able to get the coverage numbers from that.

    0 讨论(0)
  • 2020-12-13 02:42

    For me this sample of Offline Instrumentation works well.

    But it turns in my case that there is a simplier solution: just do not include the tested class in @PrepareForTest({}) annotation before its declaration.

    0 讨论(0)
  • 2020-12-13 02:44

    Use below maven plugin code snippet this works fine in jenkins as well as in local and shows full code coverage for PowermockRunner unit tests

    <build>
                <plugins>
                    <plugin>
                        <groupId>org.jacoco</groupId>
                        <artifactId>jacoco-maven-plugin</artifactId>
                        <version>${jacoco-maven-plugin.version}</version>
                        <executions>
                            <execution>
                                <id>pre-test</id>
                                <goals>
                                    <goal>prepare-agent</goal>
                                </goals>
                                <configuration>
                                    <append>true</append>                           
                                </configuration>
                            </execution>
                            <execution>
                                <id>pre-integ-test</id>
                                <goals>
                                    <goal>prepare-agent-integration</goal>
                                </goals>
                                <configuration>
                                    <append>true</append>                           
                                </configuration>
                            </execution>
    
                            <execution>
                                <id>jacoco-instrument</id>
                                <goals>
                                    <goal>instrument</goal>
                                </goals>
                            </execution>
                            <execution>
                                <id>jacoco-restore-instrumented-classes</id>
                                <goals>
                                    <goal>restore-instrumented-classes</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <excludes>
                                <exclude>*</exclude>
                            </excludes>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
    
    0 讨论(0)
  • 2020-12-13 02:49

    This pom worked for me:

     <build>
        <finalName>final-name</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <systemPropertyVariables>
                        <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.2.201409121644</version>
                <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>default-report</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    See this link.

    0 讨论(0)
提交回复
热议问题