web-dev-qa-db-fra.com

Problème de couverture PowerMock ECLEmma


Nous utilisons EasyMock et PowerMock avec JUnit. L'outil de couverture utilisé est ECLEmma. Avec EasyMock, il affiche correctement la couverture en vert (comme couvert). Cependant, pour le code testé unitaire avec PowerMock, la couverture est affichée en rouge (non couverte). J'ai lu des questions similaires sur le Web. Cependant, je voulais juste vérifier s'il y avait une solution pour cela.

Merci
Venkatesh

26
venkatesh

C'est un problème connu: https://github.com/jayway/powermock/issues/422

Et cela fait longtemps que cela ne sera pas résolu de sitôt.

Je vous suggère d'utiliser eCobertura à la place.

Oui, il existe une solution:

Vous devrez d'abord ajouter cette dépendance maven:

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

Ensuite, au lieu d'utiliser cette annotation @RunWith (PowerMockRunner.class), ajoutez simplement un @Rule dans la classe Test comme ceci:

public class Test {

   @Rule
   public PowerMockRule rule = new PowerMockRule();

vous pouvez trouver plus dans ce blog Faire fonctionner la couverture de test EclEmma avec PowerMock

14

Cela a fonctionné dans la plupart des cas dans mon projet:

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

Supprimer/Commenter @RunWith(PowerMockRunner.class) & inclure les importations suivantes après avoir ajouté powermock-module-javaagent-1.6.5.jar Dans votre chemin de classe:

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

Maintenant, faites un clic droit-> Couverture en tant que-> Configurations de couverture et ajoutez les lignes suivantes dans les arguments:

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

Cliquez sur Appliquer-> Couverture.

Notez également que @Before Ne fonctionnerait pas dans ce cas, vous devez donc ajouter tous les éléments dans les méthodes marquées avec @Test À partir de la méthode marquée avec @Before.

7
being_ethereal

Nous avons une classe statique à se moquer. Avec les classes statiques moqueuses, le plugin de couverture de code eclEmma ne fonctionne pas dans Eclipse. Nous avons donc placé @RunWith (JUnit4.class) (au lieu de @RunWith (PowerMockRunner.class)) avant la classe et placé les lignes suivantes dans la classe

static {
PowerMockAgent.initializeIfNeeded();
}

@Rule
public PowerMockRule rule = new PowerMockRule();

Compilé la classe et exécuté la classe de test. La couverture du code fonctionne pour la classe. Cette modification concerne uniquement l'IDE Eclipse.

Après avoir écrit des cas de test, nous avons rétabli le code à la normale. Placé @RunWith (PowerMockRunner.class) au lieu de @RunWith (JUnit4.class) et commenté au-dessus du code statique et des lignes de powermockrule.

2

J'ai réussi à générer une couverture PowerMock avec Jacoco, en utilisant powermock-module-javaagent.

Assurez-vous simplement de mettre l'agent powermock après agent jacoco:

<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>
...

Si vous voulez voir un exemple, jetez un œil à ce projet: https://github.com/jfcorugedo/sonar-scanner

Ici, vous pouvez voir que le sonar prend en compte les méthodes statiques et les instructions new moquées par PowerMock:

enter image description here

Si vous souhaitez vous moquer de newinstructions, assurez-vous d'utiliser PowerMockRule au lieu de PowerMockRunner.

Jetez un oeil à ce test

1
jfcorugedo

La mise à jour de la version Powermock résout mon problème ci-dessous est la dépendance maven de la version prise en charge

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

J'espère que cela t'aides !!!

0
RBS