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
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
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
.
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.
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:
Si vous souhaitez vous moquer de new
instructions, assurez-vous d'utiliser PowerMockRule
au lieu de PowerMockRunner
.
Jetez un oeil à ce test
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 !!!