首先是关于你的陈述
JaCoCo 的最新版本 0.7.8 需要 PowerMock 1.6.6
JaCoCo 不需要 PowerMock,而且 JaCoCo 0.7.8 中的 PowerMock 并没有什么特别之处。截至今天,0.7.8 只是 JaCoCo 的最新发布版本。
我猜你的陈述是来自阅读 https://github.com/powermock/powermock/wiki/Code-coverage-with-JaCoCo 的一种误解,其中指出
JaCoCo Offline Instrumentation 仅适用于 PowerMock 1.6.6 及更高版本。
根据https://github.com/powermock/powermock/blob/master/changelog.txt
更改日志 1.6.6 (2016-11-04)
- 修复了 #645 jacoco 离线检测在使用 @SuppressStaticInitializationFor 时与 powermock 字节码操作不兼容的问题
即仅针对一种特定情况进行了修复。在其他情况下,早期版本的 PowerMock 已经使用离线工具与早期版本的 JaCoCo 一起工作。
然后根据您对 PowerMock 升级到 1.6.6 后的状态描述,但在其他更改之前,尝试创建一个 Minimal, Complete, and Verifiable example :
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<powermock.version>1.6.6</powermock.version>
<jacoco.version>0.7.8</jacoco.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>org.jacoco.agent</artifactId>
<classifier>runtime</classifier>
<version>${jacoco.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<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>${jacoco.version}</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>
<phase>package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
src/main/java/org/example/BlahBlah.java:
package org.example;
public class BlahBlah {
private final SomeClass c;
public BlahBlah(SomeClass c) {
this.c = c;
}
public String run() {
return c.toString();
}
}
src/main/java/org/example/SomeClass.java:
package org.example;
public class SomeClass {
private final String s;
public SomeClass(String s) {
this.s = s;
}
@Override
public String toString() {
return s;
}
}
src/main/java/org/example/Example.java:
package org.example;
public class Example {
public String fun() {
return new BlahBlah(new SomeClass("Hello World")).run();
}
}
src/test/java/org/example/ExampleTest.java:
package org.example;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
@PrepareForTest({Example.class})
@RunWith(PowerMockRunner.class)
public class ExampleTest {
@Test
public void test() throws Exception {
BlahBlah e = new BlahBlah(new SomeClass("Hello PowerMock"));
PowerMockito.whenNew(BlahBlah.class)
.withArguments(any(SomeClass.class))
.thenReturn(e);
assertEquals("Hello PowerMock", new Example().fun());
}
}
和
mvn clean verify
工作得很好。因此,您的描述中应该还遗漏了一些其他内容来真正重现您的情况。希望这会有所帮助,至少可以在此基础上构建更好的复制器。
另外:尝试将 JaCoCo 的集成过程与 PowerMock 的升级分离——也许只是这个升级有问题,而不是 JaCoCo 的集成。