在已经检测过的文件上从gradle运行jacoco

时间:2017-06-26 19:13:19

标签: java gradle jacoco

我正在为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

1 个答案:

答案 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

org.jacoco:org.jacoco.agent
Maven存储库中的

工件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.htmlhttps://github.com/arpitgautam/jacoco