2017-06-26 60 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