2017-06-26 58 views
0

我正在尝试java项目的jacoco脱机检测。从已插装文件上的gradle运行jacoco

我创建了一个hello world gradle java项目,并用jacoco检测了它生成的类文件。当我试图对这些工具文件运行测试时。我得到以下错误。

java.lang.ClassCastException在CUTest.java:-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代理jar存在于类路径中。我在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仪表API来编写这些类后生成工具类文件。 我想从这些.class文件生成jacoco报告(已经插入)。

以下是项目的Hello World和仪表 https://github.com/arpitgautam/jacoco-rat https://github.com/arpitgautam/jacoco

+0

源文件不能编译。请提供最小化,完整和可验证的示例 - https://stackoverflow.com/help/mcve – Godin

+0

这些是jacoco检测的反编译的.class文件。源代码现在也添加了。 – Arpit

+0

这还不足以重现您的问题。怎么**完全**你的仪器类? **如何**完全**执行?如何**完全**创建报告? – Godin

回答

0

使用你的例子从https://github.com/arpitgautam/jacoco-rat在提交f4786df19a930726ebada97461d2a54ad463a4ecREADME.md描述:从构建

gradle build 

取消注释gradle.taskGraph.beforeTask .gradle

但在

采取jacoco大鼠\建造\类和仪器文件那些使用jacoco仪表API由仪表的人替换类。

使用https://github.com/arpitgautam/jacoco在提交5e7ac40627eb4e2f0882ce143f5840ee9774af57需要

变化根类文件夹

这是在我的情况

public static final String ROOT = "/tmp/jacoco-rat/build/classes/"; 

的绝对路径
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 32 
    at java.lang.String.substring(String.java:1963) 
    at com.exp.tools.JavaClassVisitor.createNewFolderName(JavaClassVisitor.java:69) 

所以改用JaCoCo command-line interface(这将是在下一版中提供)仪器类:

java -jar jacococli.jar instrument build/classes --dest build/instrumented 

和更换原件:

rm -r build/classes 
mv build/instrumented build/classes 

然后执行摇篮再次为gradle test --info,看到异常不是java.lang.ClassCastException,而是

java.lang.NoClassDefFoundError: org/jacoco/agent/rt/internal_8ff85ea/Offline 
    at com.exp.tools.CUTest.$jacocoInit(CUTest.java) 
    at com.exp.tools.CUTest.<init>(CUTest.java) 

    Caused by: 
    java.lang.ClassNotFoundException: org.jacoco.agent.rt.internal_8ff85ea.Offline 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
     ... 2 more 

报价JaCoCo FAQ

为什么我得到一个错误 “的ClassNotFoundException:org.jacoco.agent [...]脱机”?

如果使用脱机检测,检测类会直接依赖JaCoCo运行时。因此JaCoCo版本的jacocoagent.jar必须位于类路径中,并且可以通过工具类访问。

根据 http://www.jacoco.org/jacoco/trunk/doc/repo.html

Group ID Artifact ID  Description 
org.jacoco org.jacoco.agent API to get a local copy of the agent 

神器org.jacoco:org.jacoco.agent在Maven仓库不是一个实际的代理,而是一个API来得到它。实际的代理有分类runtime,即代替

testCompile group: 'org.jacoco', name: 'org.jacoco.agent', version: '0.7.9' 

你绝对应该使用

testCompile group: 'org.jacoco', name: 'org.jacoco.agent', classifier: 'runtime', version: '0.7.9' 

并修复https://github.com/arpitgautam/jacoco问题在那里等你,也许错误地使用JaCoCo的API造成java.lang.ClassCastException,或者使用已经开发的标准JaCoCo用于执行检测的工具,例如上面已经提到的命令行界面Ant Tasks,,etc

+0

我会等待jacococli.jar发布。它不在maven上。它是否可以通过其他渠道获得? – Arpit

+0

@Arpit您可以从源代码构建,或从快照Maven仓库下载 - 请参阅主页上的下载链接http://www.jacoco.org/jacoco/并链接到文档中的快照仓库http://www.jacoco.org /jacoco/trunk/doc/repo.html你也可以使用Ant Task“instrument”来做同样的工作 - http://www.jacoco.org/jacoco/trunk/doc/ant.html请不要忘记upvote并将答案标记为已接受。 – Godin