PowerMock est un framework Java open source utilisé pour créer un objet fictif lors de tests unitaires. Il étend d'autres frameworks moqueurs tels que EasyMock et Mockito pour améliorer les capacités. Le framework PowerMock utilise un chargeur de classe personnalisé et des techniques de manipulation de bytecode pour permettre la simulation des méthodes statiques, des classes finales, des méthodes finales, des méthodes privées, du constructeur et la suppression des initialiseurs statiques. L'objectif principal de PowerMock est d'étendre les API existantes avec certaines méthodes et annotations pour fournir des fonctionnalités supplémentaires qui facilitent les tests unitaires.
Le framework PowerMock fournit une classe appelée PowerMockito utilisé pour créer des objets fictifs et initie la vérification et les attentes. Le PowerMockito fournit la fonctionnalité permettant de travailler avec l'API de réflexion Java.
Comprenons le concept de PowerMock à l'aide d'un exemple.
Exemple de PowerMock avec Mockito
Ici, nous allons créer un exemple de PowerMock avec les frameworks Mockito et JUnit. Pour créer un exemple à l'aide de PowerMock, nous devons suivre les étapes suivantes.
Étape 1: Ajoutez les dépendances PowerMock suivantes dans le fichier pom.xml.
org.powermock powermock-api-mockito 1.7.0 test org.powermock powermock-module-junit4 1.7.0 test
Étape 2: Appliquer les annotations PowerMock
Pour utiliser PowerMock avec Mockito, nous devons appliquer ce qui suit deux annotations dans le test :
@RunWith(PowerMockRunner.class) : C'est la même chose que celle que nous avons utilisée dans nos exemples précédents. La seule différence est que dans l'exemple précédent, nous avons utilisé MockitoUnitRunner.class, nous allons maintenant utiliser PowerMockRunner.class pour activer les API PowerMockito dans le test.
@PrepareForTest : Il indique à PowerMock de préparer certaines classes pour les tests. Il peut être appliqué à la fois aux classes de tests et aux méthodes de test individuelles. Il comprend des classes avec des méthodes finales, statiques, privées ou natives qui peuvent être moquées.
@RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { }
Remarque : Les deux étapes ci-dessus sont obligatoires pour tous les exemples que nous allons créer à l'aide de PowerMock.
Il existe les exemples suivants de PowerMock avec les frameworks Mockito et JUnit.
1. Moqueur statique méthodes
Dans l'exemple suivant, nous allons nous moquer statique méthodes.
int à char
Étape 1: Créez une classe contenant un statique méthode. Nous avons créé une classe avec le nom Utilitaire.
Utilitaire.java
public class Utility { public static String staticMethod(String call) { return call; } }
Étape 2: Créez un scénario de test JUnit, nommé Powermock_test, à des fins de test.
Powermock_test.java
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestStaticMethod_WithPowerMockito() { String call = ' Hi there, I'm using PowerMock with Mockito '; String callexpectation = ' Call Expectation for you. '; PowerMockito.mockStatic(Utility.class); PowerMockito.when(Utility.staticMethod(call)).thenReturn(callexpectation); String actualcall = Utility.staticMethod(call); assertEquals(callexpectation, actualcall); } }
Sortir
Le résultat suivant montre que le test s’exécute avec succès.
On peut également vérifier que la méthode statique est appelée ou non, en utilisant le vérifierStatique() méthode de PowerMockito, comme indiqué ci-dessous.
PowerMockito.verifyStatic(); Utility.staticMethod(call);
2. Moqueur privé méthodes
Dans l'exemple suivant, nous allons créer une simulation de privé méthodes.
Étape 1: Créez une classe contenant une méthode privée. Nous avons créé une classe avec le nom Utilitaire et défini un privé méthode et une méthode publique (qui renvoie l’objet de la méthode privée).
comment renvoyer un tableau en Java
Utilitaire.java
public class Utility { private String privateMethod(String message) { return message; } public String callPrivateMethod(String message) { return privateMethod(message); } }
Étape 2: Créez un scénario de test JUnit nommé PowerMock_test à des fins de test.
Powermock_test.java
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestPrivateMethod_WithPowerMock() throws Exception { String message = ' PowerMock with Mockito and JUnit '; String expectedmessage = ' Using with EasyMock '; Utility mock =PowerMockito.spy(new Utility()); PowerMockito.doReturn(expectedmessage).when(mock, 'privateMethod', message); String actualmessage = mock.callPrivateMethod(message); assertEquals(expectedmessage, actualmessage); System.out.println(PowerMockito.verifyPrivate(getClass())); } }
Sortir
Le résultat suivant montre que le test s’exécute avec succès.
3. Moqueur final méthodes
Dans l'exemple suivant, nous allons nous moquer final méthodes.
Étape 1: Créez une classe contenant un final méthode. Nous avons créé une classe avec le nom Utility et défini une méthode finale nommée méthode finale.
Utilitaire.java
public class Utility { public final String finalMethod(String message) { return message; } }
Étape 2: Créez un scénario de test JUnit nommé Powermock_test à des fins de tests.
Powermock_test.java
import static junit.framework.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(Utility.class) public class Powermock_test { @Test public void TestFinalMethod_WithPowerMock() throws Exception { String message = ' PowerMock with Mockito and JUnit '; Utility uti = PowerMockito.mock(Utility.class); PowerMockito.whenNew(Utility.class).withNoArguments().thenReturn(uti); Utility uti2 = new Utility(); PowerMockito.verifyNew(Utility.class).withNoArguments(); PowerMockito.when(uti2.finalMethod(message)).thenReturn(message); String message2 = uti2.finalMethod(message); Mockito.verify(uti2).finalMethod(message); assertEquals(message, message2); } }
Sortir
Le résultat suivant montre que le test s’exécute avec succès.