我正在为java项目尝试jacoco离线检测。
我创建了一个hello world gradle java项目,并使用jacoco对其生成的类文件进行了检测。当我尝试对这些检测文件运行测试时。我收到了以下错误。
CUTest.java上的java.lang.ClassCastException: -
反编译的测试.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
答案 0 :(得分:0)
使用f4786df19a930726ebada97461d2a54ad463a4ec
中提交的README.md
中的示例,如gradle build
中所述:
5e7ac40627eb4e2f0882ce143f5840ee9774af57
从build.gradle取消注释gradle.taskGraph.beforeTask
但在
期间获取jacoco-rat \ build \ classes中的文件,并使用jacoco instrumentation api替换类中的文件。
使用需要
的提交public static final String ROOT = "/tmp/jacoco-rat/build/classes/";
的{{3}}
将ROOT更改为类文件夹的绝对路径
在我的情况下
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)
得到
java -jar jacococli.jar instrument build/classes --dest build/instrumented
因此使用https://github.com/arpitgautam/jacoco-rat(将在下一版本中提供)来使用仪器类:
rm -r build/classes
mv build/instrumented build/classes
并替换原件:
gradle test --info
然后再次以java.lang.ClassCastException
执行Gradle并看到该异常不是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
,而是
Group ID Artifact ID Description
org.jacoco org.jacoco.agent API to get a local copy of the agent
引用https://github.com/arpitgautam/jacoco:
为什么我会收到错误&#34; ClassNotFoundException:org.jacoco.agent [...]离线&#34;?
如果使用脱机检测,则检测类将直接依赖于JaCoCo运行时。因此,同一JaCoCo版本的jacocoagent.jar必须位于类路径上,并且可以通过检测类访问。
根据JaCoCo command-line interface:
Maven存储库中的org.jacoco:org.jacoco.agent
工件runtime
不是真正的代理,而是获取它的API。实际代理具有分类器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'
你绝对应该使用
java.lang.ClassCastException
并修复JaCoCo FAQ中的问题,其中你可能错误地使用导致function ame_process_bbcode(&$parser, &$param1, $param2 = '')
{
if (class_exists('vB_BbCodeParser_Wysiwyg') AND is_a($parser, 'vB_BbCodeParser_Wysiwyg'))
{
return $text;
}
else
{
global $vbulletin;
($hook = vBulletinHook::fetch_hook('automediaembed_parse_bbcode_start')) ? eval($hook) : false;
$ameinfo = fetch_full_ameinfo();
$text = preg_replace($ameinfo['find'], $ameinfo['replace'], ($param2 ? $param2 : $param1), 1);
($hook = vBulletinHook::fetch_hook('automediaembed_parse_bbcode_end')) ? eval($hook) : false;
return $text;
}
}
的JaCoCo API,或者使用已经开发的标准JaCoCo工具来执行上面已经提到的命令行界面,{{{ 3}},http://www.jacoco.org/jacoco/trunk/doc/repo.html,https://github.com/arpitgautam/jacoco。