2016-10-16 6 views
1

オフライン計測を使用してjacocoでカバレッジを取得しようとしています(オンザフライ計測を使用できません。 Powermockテストケース)を作成しました。以下に示すように、surefireプラグインのクラスパスにjacocoagent.jarを追加しました。 "org.jacoco.agent-0.7.7.201606060606-runtime.jar"(ローカルのMavenリポジトリから)を "jacocoagent.jar"に改名し、このpom.xmlが存在する同じフォルダに保存しました。例外をクラスパスに追加した後でも例外です。 pom.xmlのJacoco - 「原因:java.lang.ClassNotFoundException:org.jacoco.agent.rt.internal_6da5971.Offline」

スニペット(確実な - プラグイン構成)コンソール上で見

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
        <forkmode>once</forkmode> 
        <additionalClasspathElements> 
      <additionalClasspathElement>jacocoagent.jar</additionalClasspathElement> 
             </additionalClasspathElements> 
       </configuration> 
    </plugin> 

例外:

############# 
Number of foreign imports: 1 
import: Entry[import from realm ClassRealm[maven.api, parent: null]] 

----------------------------------------------------- 

     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:166) 
     ... 21 more 
Caused by: java.lang.NoClassDefFoundError: org/jacoco/agent/rt/internal_6da5971/Offline 
     at com.cisco.ise.ups.modelframework.hibernate.OracleNamingStrategy.$jacocoInit(OracleNamingStrategy.java) 
     at com.cisco.ise.ups.modelframework.hibernate.OracleNamingStrategy.<clinit>(OracleNamingStrategy.java) 
     at sun.misc.Unsafe.ensureClassInitialized(Native Method) 
     at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43) 
     at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:142) 
     at java.lang.reflect.Field.acquireFieldAccessor(Field.java:1082) 
     at java.lang.reflect.Field.getFieldAccessor(Field.java:1063) 
     at java.lang.reflect.Field.get(Field.java:387) 
     at com.cisco.ise.ups.build.WorkflowRunnerMojo.namingStrategyInstance(WorkflowRunnerMojo.java:335) 
     at com.cisco.ise.ups.build.WorkflowRunnerMojo.setupWorkflowEnvironment(WorkflowRunnerMojo.java:514) 
     at com.cisco.ise.ups.build.WorkflowRunnerMojo.execute(WorkflowRunnerMojo.java:816) 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134) 
     ... 21 more 
Caused by: java.lang.ClassNotFoundException: org.jacoco.agent.rt.internal_6da5971.Offline 
     at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) 
     at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271) 
     at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247) 
     at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239) 
     ... 33 more 
[ERROR] 
############### 

手順に従う:

  1. "mvn compile" "mvn org.jacoco:jacoco-maven-plugin:instrument"
  2. "mvn test" - このステップで例外が発生しました。

この例外を取り除く方法を教えてください。それはクラスパスを追加するための正しい場所でしたか? (確実なプラグインで)ORを指定する必要がありますか?

ありがとうございます。ソナー+ JaCoCo + PowerMockを得る上

+0

私はそれがテストのためにライブラリを追加する必要がある場合、彼らはスコープ=テストで、ポンポンの '<依存性>'セクションで指定する必要があり、ことを賭けると思います。 –

+0

@LittleSanti:提案ごとにpom.xmlを調整しました。まだ問題(例外)が残っています。 タブにこれらの行を追加しました。 org.jacoco org.jacoco。エージェント テスト ランタイム 0.7.7.201606060606 。 **すでにjacocoagent.jarがダウンロードされ、ディスク上に存在しています。インストルメントクラスがそれを開始できるように**これをclasspathで利用できるようにするだけです**(http://www.eclemma.org/jacoco/trunk/doc/offline.html)。わからない、まだ何が足りないのか! – gthy

+0

私は参照してください。まあ...他の解決策は、プラグインのクラスローダーがテストされたコードのクラスローダーと異なる可能性があるため、**プラグインの依存関係の中でその依存関係を設定することです。 –

答えて

0

dr. macphail's trance article は私のために仕事をした:ブログの記事のコメント欄で述べたように

<!-- Provide information for coverage per test --> 
    <profile> 
    <id>coverage-per-test</id> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.20</version> 
       <configuration> 
       <argLine>${argLine} -Xverify:none</argLine> 
       <properties> 
        <property> 
         <name>listener</name> 
         <value>org.sonar.java.jacoco.JUnitListener</value> 
        </property> 
       </properties> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>org.sonarsource.java</groupId> 
      <artifactId>sonar-jacoco-listeners</artifactId> 
      <version>4.9.0.9858</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    </profile> 

:場合

デフォルトのargLineではありません「単純な場合は、次のスニペットを使用する必要があります。

{argLine} -XX:-UseSplitVerifier

そうしないと、ClassNotFoundExceptionが発生する可能性があります。 java.lang.ClassNotFoundException:org.jacoco.agent.rt.RT

0

surefireプラグインのクラスパスは必要ありません。あなたはこのように、テストを持っている各モジュールに依存関係を追加する必要があります。

<dependency> 
    <groupId>org.jacoco</groupId> 
    <artifactId>org.jacoco.agent</artifactId> 
    <classifier>runtime</classifier> 
    <scope>test</scope> 
    <version>${your.jacoco.version}</version> 
</dependency> 

は、あなたが「クラシファイア」の部分を逃していないことを確認してください、またはそれが動作しません。

Full example from PowerMock project

関連する問題