[JAVA] Méthodes statiques simulées 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. Mock méthodes statiques avec PowerMock ← Maintenant ici
  4. Simulez le constructeur avec PowerMock
  5. Méthodes privées simulées avec PowerMock
  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 d'une méthode statique sur n'importe quelle valeur ou la faire renvoyer une exception.

Ici, on suppose que la méthode statique de la classe Utility (classe moqueuse) 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 statique de la classe Utility en interne et je souhaite définir ces valeurs de retour et ces exceptions.

UseUtility.java


public class UseUtility {

	public String getMessage(String name) throws Exception {

		String trimmedName = Utility.trim(name);

		return "Hello, " + trimmedName + ".";
	}

	public boolean setUp() {

		Utility.clearDatabase();

		//réduction

		return true;
	}
}

Classe de moquerie

Moquez-le et définissez un comportement arbitraire.

Utility.java


public class Utility {

	public static String trim(String string) throws Exception {
		//Hypothèse non mise en œuvre
		return string;
	}

	public static void clearDatabase() {
		//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.

Pour @ PrepareForTest, spécifiez la classe à simuler. Lorsque vous vous moquez uniquement de méthodes statiques, il n'est pas nécessaire de décrire la classe appelante (classe cible de test).

UseUtilityTest.java


@RunWith(PowerMockRunner.class)
@PrepareForTest(Utility.class)
public class UseUtilityTest {
    //réduction
}

Exemple d'utilisation

doReturn Définissez la valeur de retour dans la méthode statique.

@Test(expected = Exception.class)
public void test_doThrow() throws Exception {
	//Préparation
	String name = "John ";
	Exception expected_exception = new Exception("error!");

	//Railleur
	PowerMockito.mockStatic(Utility.class);
	//Définir une classe fictive et une exception
	PowerMockito.doThrow(expected_exception).when(Utility.class);
	//Définissez une méthode qui renvoie le jeu d'exceptions dans ↑
	Utility.trim(anyString());

	//Courir
	UseUtility obj = new UseUtility();
	obj.getMessage(name);
}

doThrow Lancez une exception avec la méthode statique.

@Test
public void test_doThrow() throws Exception {
	//Préparation
	String name = "John ";
	String expected_message = "error!";
	Exception expected_exception = new IllegalArgumentException(expected_message);

	//Railleur
	PowerMockito.mockStatic(Utility.class);
	//Définir une classe fictive et une exception
	PowerMockito.doThrow(expected_exception).when(Utility.class);
	//Définissez une méthode qui renvoie le jeu d'exceptions dans ↑
	Utility.trim(anyString());

	//Courir
	try {
		UseUtility obj = new UseUtility();
		obj.getMessage(name);
		fail();
	} catch (Exception e) {
		//Vérifiez le résultat
		assertEquals(expected_exception, e.getCause());
		assertEquals(expected_message, e.getMessage());
	}
}

doCallRealMethod Appelez la méthode réelle sans définir de valeur de retour ou d'exception pour la méthode statique.

@Test
public void test_doCallRealMethod() throws Exception {
	//Préparation
	String name = "John ";
	String expected = "Hello, John .";

	//Railleur
	PowerMockito.mockStatic(Utility.class);
	//Réglage pour appeler la classe simulée et la vraie chose
	PowerMockito.doCallRealMethod().when(Utility.class);
	//Définir une méthode pour appeler la chose réelle
	Utility.trim(anyString());

	//Courir
	UseUtility obj = new UseUtility();
	String actual = obj.getMessage(name);

	//Vérifiez le résultat
	assertEquals(expected, actual);
}

doNothing À utiliser lorsque vous ne souhaitez rien faire avec la méthode statique.

@Test
public void test_doNothing() throws Exception {
	//Prêt à courir
	//Railleur
	PowerMockito.mockStatic(Utility.class);
	//Mock class et ne rien faire
	PowerMockito.doNothing().when(Utility.class);
	//Définissez une méthode qui ne fait rien
	Utility.clearDatabase();

	//Courir
	UseUtility obj = new UseUtility();
	boolean actual = obj.setUp();

	//Vérifiez le résultat
	assertTrue(actual);
}

thenReturn Définissez la valeur de retour dans la méthode statique.

@Test
public void test_thenReturn() throws Exception {
	//Préparation
	String name = "John ";
	String expected = "Hello, John.";

	//Railleur
	PowerMockito.mockStatic(Utility.class);
	//Définir la valeur de retour
	PowerMockito.when(Utility.trim(anyString())).thenReturn("John");

	//Courir
	UseUtility obj = new UseUtility();
	String actual = obj.getMessage(name);

	//Vérifiez le résultat
	assertEquals(expected, actual);
}

thenThrow Lancez une exception avec la méthode statique.

@Test(expected = Exception.class)
public void test_thenThrow() throws Exception {
	//Préparation
	String name = "John ";
	Exception expected_exception = new Exception("error!");

	//Railleur
	PowerMockito.mockStatic(Utility.class);
	//Définir une exception
	PowerMockito.when(Utility.trim(anyString())).thenThrow(expected_exception);

	//Courir
	UseUtility obj = new UseUtility();
	obj.getMessage(name);
}

thenCallRealMethod Appelez la méthode réelle sans définir de valeur de retour ou d'exception pour la méthode statique.

@Test
public void test_thenCallRealMethod() throws Exception {
	//Préparation
	String name = "John ";
	String expected = "Hello, John .";

	//Railleur
	PowerMockito.mockStatic(Utility.class);
	//Mise à appeler la vraie chose
	PowerMockito.when(Utility.trim(anyString())).thenCallRealMethod();

	//Courir
	UseUtility obj = new UseUtility();
	String actual = obj.getMessage(name);

	//Vérifiez le résultat
	assertEquals(expected, actual);
}

Validation des méthodes statiques

PowerMock fournit verifyStatic pour valider les méthodes statiques simulées.

Vous pouvez utiliser les heures de Mockito, atLeast, asLeastOnce, etc. pour vérifier le nombre d'appels.

verifyStatic (Utility.class) est synonyme de verifyStatic (Utility.class, times (1)).

//Confirmez qu'il a été appelé une fois
PowerMockito.verifyStatic(Utility.class);
Utility.trim(anyString());

Recommended Posts

Méthodes statiques simulées avec PowerMock
Mock Enum avec PowerMock
Mock le constructeur avec PowerMock
Méthodes statiques simulées dans Mockito 3.4
Mock seulement quelques méthodes avec Spock
Comment se moquer de chaque cas avec PowerMock + Mockito1x
MOCK les constructeurs d'autres classes avec Spring MVC + PowerMock + Junit
[Java] JavaConfig avec classe interne statique
Mock et espionner PowerMock
Désactiver l'initialiseur statique dans PowerMock
Vitesse de traitement avec et sans statique
[Ruby] Gérez les variables d'instance avec des méthodes d'instance
[Java] Tester des méthodes privées avec JUnit