我正在为java项目尝试jacoco离线检测 .
我创建了一个hello world gradle java项目,并使用jacoco对其生成的类文件进行了检测 . 当我尝试对这些检测文件运行测试时 . 我收到了以下错误 .
CUTest.java上的java.lang.ClassCastException: - 1
反编译的测试.class文件是
import org.junit.Test;
public class CUTest
{
public CUTest()
{
arrayOfBoolean[0] = true;
}
@Test
public void test()
{
boolean[] arrayOfBoolean = $jacocoInit();CUT localCUT1 = new CUT();arrayOfBoolean[1] = true;
CUT c;
c.meth();
arrayOfBoolean[2] = true;
}
}
检测源.class文件是
import java.io.PrintStream;
public class CUT
{
public CUT()
{
arrayOfBoolean[0] = true;
}
public void meth()
{
boolean[] arrayOfBoolean = $jacocoInit();System.out.println("hello world");
arrayOfBoolean[1] = true;
}
}
jacoco agent jar存在于classpath中 . 我在build.gradle中添加了一个测试编译依赖项 .
这是源文件(不是反编译的类文件)
public class CUT {
public void meth(){
System.out.println("hello world");
}
}
测试来源
import static org.junit.Assert.*;
import org.junit.Test;
public class CUTest {
@Test
public void test() {
CUT c = new CUT();
c.meth();
}
}
我使用jacoco instrumentation api来编译这些类后生成的仪器类文件 . 我想从这些.class文件生成jacoco报告(已经过检测) .
以下是hello world和instrumentation的项目https://github.com/arpitgautam/jacoco-rat https://github.com/arpitgautam/jacoco
1 回答
在
README.md
中描述的提交f4786df19a930726ebada97461d2a54ad463a4ec
中使用https://github.com/arpitgautam/jacoco-rat中的示例:但在期间
在需要提交
5e7ac40627eb4e2f0882ce143f5840ee9774af57
时使用https://github.com/arpitgautam/jacoco这是我的情况
拿到
因此,使用JaCoCo command-line interface(将在下一版本中提供)来仪器类:
并取代原件:
然后再次执行Gradle为
gradle test --info
并看到该异常不是java.lang.ClassCastException
,但是引用JaCoCo FAQ:
根据http://www.jacoco.org/jacoco/trunk/doc/repo.html:
Maven资源库中的工件
org.jacoco:org.jacoco.agent
不是一个真正的代理,而是一个获取它的API . 实际代理有分类器runtime
,即代替你绝对应该使用
并修复https://github.com/arpitgautam/jacoco中的问题,其中你可能错误地使用导致
java.lang.ClassCastException
的JaCoCo API,或者使用已经开发的标准JaCoCo工具来执行仪器,例如上面提到的命令行界面,Ant Tasks,Maven Plugin,etc .