web-dev-qa-db-ja.com

PowerMock ECLEmmaカバレッジの問題


JUnitでEasyMockとPowerMockを使用しています。使用されるカバレッジツールはECLEmmaです。 EasyMockを使用すると、カバレッジが緑色で適切に表示されます(カバーされているとおり)。ただし、PowerMockで単体テストされたコードの場合、カバレッジは赤(カバーされていない)で表示されます。ウェブで同様の質問を読んだことがあります。ただし、これに対する解決策があるかどうかを確認したかっただけです。

ありがとう
ベンカテッシュ

24
venkatesh

それは既知の問題です: https://github.com/jayway/powermock/issues/422

そしてそれは長い間、それはすぐに修正されません。

代わりに eCobertura を使用することをお勧めします。

はい、これには解決策があります。

最初に、このMaven依存関係を追加する必要があります。

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-module-junit4-rule-agent</artifactId>
  <version>1.6.4</version>
  <scope>test</scope>
</dependency>

次に、このアノテーション@RunWith(PowerMockRunner.class)を使用する代わりに、次のようにTestクラスに@Ruleを追加するだけです。

public class Test {

   @Rule
   public PowerMockRule rule = new PowerMockRule();

このブログで詳細を確認できます PowerMockでEclEmmaテストカバレッジを機能させる

これは私のプロジェクトのほとんどの場合で機能しました:

_@Rule
public PowerMockRule rule = new PowerMockRule();
static {
    PowerMockAgent.initializeIfNeeded();
}
_

@RunWith(PowerMockRunner.class)を削除/コメントし、クラスパスに_powermock-module-javaagent-1.6.5.jar_を追加した後、次のインポートを含めます。

_import org.junit.Rule;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.powermock.modules.agent.PowerMockAgent;
_

次に、右クリック->カバレッジの範囲->カバレッジの構成を選択し、引数に次の行を追加します。

_-ea -noverify -javaagent:path/to/powermock-module-javaagent-1.6.5.jar
_

[適用]-> [カバレッジ]をクリックします。

また、この場合_@Before_は機能しないため、_@Test_でマークされたメソッドから_@Before_でマークされたメソッドにすべてのものを追加する必要があります。

7
being_ethereal

モックする静的クラスがあります。静的クラスをモックすると、eclEmmaコードカバレッジプラグインはEclipseで機能しません。そこで、クラスの前に@RunWith(JUnit4.class)(@RunWith(PowerMockRunner.class)の代わりに)を配置し、クラス内に次の行を配置しました

static {
PowerMockAgent.initializeIfNeeded();
}

@Rule
public PowerMockRule rule = new PowerMockRule();

クラスをコンパイルし、テストクラスを実行しました。コードカバレッジはクラスで機能しています。この変更はEclipse IDEでのみ行われます。

テストケースを作成した後、コードを通常の状態に戻しました。 @RunWith(JUnit4.class)の代わりに@RunWith(PowerMockRunner.class)を配置し、静的コードとpowermockrule行の上にコメントしました。

powermock-module-javaagentを使用して、JacocoでPowerMockカバレッジを生成することができました。

必ずpowermockエージェントafterjacocoエージェントを配置してください:

<artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <useSystemClassLoader>true</useSystemClassLoader>
                <argLine>${jacocoArgLine} -javaagent:${settings.localRepository}/org/powermock/powermock-module-javaagent/${powermock.version}/powermock-module-javaagent-${powermock.version}.jar -noverify</argLine>
...

例を見たい場合は、このプロジェクトをご覧ください: https://github.com/jfcorugedo/sonar-scanner

ここで、ソナーは静的メソッドとPowerMockによってモックされたnewステートメントを考慮していることがわかります。

enter image description here

newstatementsをモックする場合は、PowerMockRuleの代わりにPowerMockRunnerを使用してください。

このテスト を見てください

1
jfcorugedo

Powermockバージョンを更新すると、以下の問題が修正されます。サポートされているバージョンのMaven依存関係です。

<dependency>
   <groupId>org.powermock</groupId>
   <artifactId>powermock-module-junit4-rule-agent</artifactId>
   <version>1.7.3</version>
   <scope>test</scope>
</dependency>

お役に立てれば !!!

0
RBS