[JAVA] Simuler une méthode privée avec PowerMock

table des matières

  1. Procédure de création d'un environnement pour l'utilisation de PowerMock
  2. Mock and Spy in PowerMock
  3. Méthodes statiques simulées avec PowerMock
  4. Simulez le constructeur avec PowerMock
  5. Mock méthodes privées avec PowerMock ← Maintenant ici
  6. Essayez d'utiliser la WhiteBox de PowerMock
  7. Désactiver l'initialiseur statique dans PowerMock

Aperçu

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.

Classe testé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;
	}
}

Classe de moquerie

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

Classe d'essai

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
}

Exemple d'utilisation

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);
}

Validation des méthodes privées

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

Simuler une méthode privée avec PowerMock
Tester les méthodes privées dans JUnit
Tester les méthodes privées dans JUnit
Méthodes statiques simulées dans Mockito 3.4
Mock Enum avec PowerMock
Comment se moquer d'un appel de super méthode dans PowerMock
Vérifier la méthode privée de l'interface Java9
Mock et espionner PowerMock
Mock le constructeur avec PowerMock
Points à garder à l'esprit lors du test de méthodes privées dans JUnit
Désactiver l'initialiseur statique dans PowerMock
Méthodes fréquemment utilisées dans Active Record
[Java] Tester des méthodes privées avec JUnit
Mock seulement quelques méthodes avec Spock
Méthodes Ruby souvent utilisées dans Rails