Avec PowerMock, vous pouvez définir la valeur de retour de la méthode privée sur n'importe quelle valeur ou renvoyer une exception.
Il est supposé que la méthode privée de la classe Utility (classe mocking) appelée depuis la classe UseUtility (classe cible de test) est simulée.
C'est la classe à tester qui est appelée depuis JUnit.
J'appelle la méthode publique de la classe Utility dans la méthode.
UseUtility.java
public class UseUtility {
public String getMessage(String id) throws Exception {
Utility utility = new Utility();
Map<String, String> userInfo = utility.getUserInfo(id);
String message = id + ":" + userInfo.get(id);
return message;
}
}
J'appelle une méthode privée dans une méthode publique et je veux me moquer d'elle.
Utility.java
public class Utility {
public Utility() {
//réduction
}
public Map<String, String> getUserInfo(String id) throws Exception {
this.connectDatabase("env");
Map<String, String> userInfo = new HashMap<>();
userInfo.put(id, this.getName(id));
return userInfo;
}
private String getName(String id) throws Exception {
//Hypothèse non mise en œuvre
return "";
}
private void connectDatabase(String env) {
//Hypothèse de traitement que vous ne souhaitez pas exécuter
}
}
Un JUnit qui appelle la classe testée.
Pour utiliser PowerMock avec JUnit, spécifiez PowerMockRunner pour @ RunWith
.
Notez que dans @ PrepareForTest
, vous devez écrire non seulement la classe à se moquer, mais également la classe qui appelle le constructeur.
UseUtilityTest.java
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Utility.class, UseUtility.class })
public class UseUtilityTest {
//réduction
}
doReturn Définissez la valeur de retour dans la méthode privée.
Pour simuler, utilisez when (objet fictif, chaîne de nom de méthode privée, argument de méthode privée, ...)
.
@Test
public void test_doReturn() throws Exception {
//Préparation
String id = "0001";
String expected = "0001:TestUser";
//Espion
Utility spy = PowerMockito.spy(new Utility());
//Définir l'instance à renvoyer par le constructeur
PowerMockito.whenNew(Utility.class).withNoArguments().thenReturn(spy);
//Définit la valeur de retour de la méthode privée de la classe épicée
PowerMockito.doReturn("TestUser").when(spy, "getName", anyString());
//Courir
UseUtility obj = new UseUtility();
String actual = obj.getMessage(id);
//Vérifiez le résultat
assertEquals(expected, actual);
}
doThrow Lancez une exception avec une méthode privée.
@Test(expected = Exception.class)
public void test_doThrow() throws Exception {
//Préparation
String id = "0001";
Exception expected_exception = new Exception("error!");
//Espion
Utility spy = PowerMockito.spy(new Utility());
//Définir l'instance à renvoyer par le constructeur
PowerMockito.whenNew(Utility.class).withNoArguments().thenReturn(spy);
//Définir des exceptions à renvoyer dans les méthodes privées des classes épicées
PowerMockito.doThrow(expected_exception).when(spy, "getName", anyString());
//Courir
UseUtility obj = new UseUtility();
obj.getMessage(id);
}
doCallRealMethod Appelez la méthode réelle sans revenir à la méthode privée ou définir des exceptions.
@Test
public void test_doCallRealMethod() throws Exception {
//Préparation
String id = "0001";
String expected = "0001:";
//Espion
Utility spy = PowerMockito.spy(new Utility());
//Définir l'instance à renvoyer par le constructeur
PowerMockito.whenNew(Utility.class).withNoArguments().thenReturn(spy);
//Configuré pour appeler la chose réelle avec la méthode privée de la classe épicée
PowerMockito.doCallRealMethod().when(spy, "getName", anyString());
//Courir
UseUtility obj = new UseUtility();
String actual = obj.getMessage(id);
//Vérifiez le résultat
assertEquals(expected, actual);
}
doNothing Utilisez cette option lorsque vous ne souhaitez rien faire avec la méthode privée.
@Test
public void test_doNothing() throws Exception {
//Préparation
String id = "0001";
String expected = "0001:";
//Espion
Utility spy = PowerMockito.spy(new Utility());
//Définir l'instance à renvoyer par le constructeur
PowerMockito.whenNew(Utility.class).withNoArguments().thenReturn(spy);
//Définissez la méthode privée de la classe épicée pour ne rien faire
PowerMockito.doNothing().when(spy, "connectDatabase", anyString());
//Courir
UseUtility obj = new UseUtility();
String actual = obj.getMessage(id);
//Vérifiez le résultat
assertEquals(expected, actual);
}
thenReturn Définissez la valeur de retour dans la méthode privée.
@Test
public void test_thenReturn() throws Exception {
//Préparation
String id = "0001";
String expected = "0001:TestUser";
//Espion
Utility spy = PowerMockito.spy(new Utility());
//Définir l'instance à renvoyer par le constructeur
PowerMockito.whenNew(Utility.class).withNoArguments().thenReturn(spy);
//Définit la valeur de retour de la méthode privée de la classe épicée
PowerMockito.when(spy, "getName", anyString()).thenReturn("TestUser");
//Courir
UseUtility obj = new UseUtility();
String actual = obj.getMessage(id);
//Vérifiez le résultat
assertEquals(expected, actual);
}
thenThrow Lancez une exception avec une méthode privée.
@Test(expected = Exception.class)
public void test_thenThrow() throws Exception {
//Préparation
String id = "0001";
Exception expected_exception = new Exception("error!");
//Espion
Utility spy = PowerMockito.spy(new Utility());
//Définir l'instance à renvoyer par le constructeur
PowerMockito.whenNew(Utility.class).withNoArguments().thenReturn(spy);
//Définir des exceptions à renvoyer dans les méthodes privées des classes épicées
PowerMockito.when(spy, "getName", anyString()).thenThrow(expected_exception);
//Courir
UseUtility obj = new UseUtility();
obj.getMessage(id);
}
thenCallRealMethod Appelez la méthode réelle sans revenir à la méthode privée ou définir des exceptions.
@Test
public void test_thenCallRealMethod() throws Exception {
//Préparation
String id = "0001";
String expected = "0001:";
//Espion
Utility spy = PowerMockito.spy(new Utility());
//Définir l'instance à renvoyer par le constructeur
PowerMockito.whenNew(Utility.class).withNoArguments().thenReturn(spy);
//Configuré pour appeler la chose réelle avec la méthode privée de la classe épicée
PowerMockito.when(spy, "getName", anyString()).thenCallRealMethod();
//Courir
UseUtility obj = new UseUtility();
String actual = obj.getMessage(id);
//Vérifiez le résultat
assertEquals(expected, actual);
}
PowerMock fournit verifyPrivate pour la validation des méthodes privées simulées.
Vous pouvez utiliser les heures de Mockito, atLeast, asLeastOnce, etc. pour vérifier le nombre d'appels.
verifyPrivate ([objet maquette]) est synonyme de verifyPrivate ([objet maquette], times (1)).
//Confirmez qu'il a été appelé une fois
PowerMockito.verifyPrivate(spy).invoke("getName", anyString());
Recommended Posts