[JAVA] Verspotten Sie statische Methoden mit PowerMock

Inhaltsverzeichnis

  1. Verfahren zum Erstellen einer Umgebung für die Verwendung von PowerMock
  2. Mock and Spy in PowerMock
  3. Verspotten Sie statische Methoden mit PowerMock ← Jetzt hier
  4. Verspotten Sie den Konstruktor mit PowerMock
  5. Private Methoden mit PowerMock verspotten
  6. Verwenden Sie die WhiteBox von PowerMock
  7. Statischen Initialisierer in PowerMock deaktivieren

Überblick

Mit PowerMock können Sie den Rückgabewert einer statischen Methode auf einen beliebigen Wert setzen oder eine Ausnahme zurückgeben.

Hier wird angenommen, dass die statische Methode der Utility-Klasse (Mocking-Klasse), die von der UseUtility-Klasse (Testzielklasse) aufgerufen wird, verspottet wird.

Getestete Klasse

Dies ist die zu testende Klasse, die von JUnit aufgerufen wird.

Ich rufe die statische Methode der Utility-Klasse intern auf und möchte diese Rückgabewerte und Ausnahmen festlegen.

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

		//Kürzung

		return true;
	}
}

Spottklasse

Verspotten Sie es und definieren Sie willkürliches Verhalten.

Utility.java


public class Utility {

	public static String trim(String string) throws Exception {
		//Nicht umgesetzte Annahme
		return string;
	}

	public static void clearDatabase() {
		//Annahme einer Verarbeitung, die Sie nicht ausführen möchten
	}
}

Testklasse

Eine JUnit, die die zu testende Klasse aufruft.

Um PowerMock mit JUnit zu verwenden, geben Sie PowerMockRunner für "@ RunWith" an.

Geben Sie für "@ PrepareForTest" die zu verspottende Klasse an. Wenn nur statische Methoden verspottet werden, muss die aufrufende Klasse (Testzielklasse) nicht beschrieben werden.

UseUtilityTest.java


@RunWith(PowerMockRunner.class)
@PrepareForTest(Utility.class)
public class UseUtilityTest {
    //Kürzung
}

Anwendungsbeispiel

doReturn Legen Sie den Rückgabewert in der statischen Methode fest.

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

	//Verspottung
	PowerMockito.mockStatic(Utility.class);
	//Legen Sie die Scheinklasse und die Ausnahme fest
	PowerMockito.doThrow(expected_exception).when(Utility.class);
	//Legen Sie eine Methode fest, die die in ↑ festgelegte Ausnahme zurückgibt
	Utility.trim(anyString());

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

doThrow Mit der statischen Methode eine Ausnahme auslösen.

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

	//Verspottung
	PowerMockito.mockStatic(Utility.class);
	//Legen Sie die Scheinklasse und die Ausnahme fest
	PowerMockito.doThrow(expected_exception).when(Utility.class);
	//Legen Sie eine Methode fest, die die in ↑ festgelegte Ausnahme zurückgibt
	Utility.trim(anyString());

	//Lauf
	try {
		UseUtility obj = new UseUtility();
		obj.getMessage(name);
		fail();
	} catch (Exception e) {
		//Überprüfen Sie das Ergebnis
		assertEquals(expected_exception, e.getCause());
		assertEquals(expected_message, e.getMessage());
	}
}

doCallRealMethod Rufen Sie die reale Methode auf, ohne einen Rückgabewert oder eine Ausnahme für die statische Methode festzulegen.

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

	//Verspottung
	PowerMockito.mockStatic(Utility.class);
	//Einstellung, um die Scheinklasse und die reale Sache aufzurufen
	PowerMockito.doCallRealMethod().when(Utility.class);
	//Legen Sie eine Methode fest, um die reale Sache aufzurufen
	Utility.trim(anyString());

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

	//Überprüfen Sie das Ergebnis
	assertEquals(expected, actual);
}

doNothing Verwenden Sie diese Option, wenn Sie mit der statischen Methode nichts tun möchten.

@Test
public void test_doNothing() throws Exception {
	//Bereit zu rennen
	//Verspottung
	PowerMockito.mockStatic(Utility.class);
	//Klasse verspotten und nichts einstellen
	PowerMockito.doNothing().when(Utility.class);
	//Legen Sie eine Methode fest, die nichts bewirkt
	Utility.clearDatabase();

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

	//Überprüfen Sie das Ergebnis
	assertTrue(actual);
}

thenReturn Legen Sie den Rückgabewert in der statischen Methode fest.

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

	//Verspottung
	PowerMockito.mockStatic(Utility.class);
	//Rückgabewert einstellen
	PowerMockito.when(Utility.trim(anyString())).thenReturn("John");

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

	//Überprüfen Sie das Ergebnis
	assertEquals(expected, actual);
}

thenThrow Mit der statischen Methode eine Ausnahme auslösen.

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

	//Verspottung
	PowerMockito.mockStatic(Utility.class);
	//Ausnahme setzen
	PowerMockito.when(Utility.trim(anyString())).thenThrow(expected_exception);

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

thenCallRealMethod Rufen Sie die reale Methode auf, ohne einen Rückgabewert oder eine Ausnahme für die statische Methode festzulegen.

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

	//Verspottung
	PowerMockito.mockStatic(Utility.class);
	//Einstellung, um die reale Sache zu nennen
	PowerMockito.when(Utility.trim(anyString())).thenCallRealMethod();

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

	//Überprüfen Sie das Ergebnis
	assertEquals(expected, actual);
}

Validierung statischer Methoden

PowerMock bietet verifyStatic zum Überprüfen verspotteter statischer Methoden.

Sie können Mockitos Zeiten, mindestens, mindestens einmal usw. verwenden, um die Anzahl der Anrufe zu überprüfen.

verifyStatic (Utility.class) ist gleichbedeutend mit verifyStatic (Utility.class, times (1)).

//Bestätigen Sie, dass es einmal aufgerufen wurde
PowerMockito.verifyStatic(Utility.class);
Utility.trim(anyString());

Recommended Posts

Verspotten Sie statische Methoden mit PowerMock
Mock Enum mit PowerMock
Verspotten Sie den Konstruktor mit PowerMock
Verspotten Sie statische Methoden in Mockito 3.4
Verspotten Sie nur einige Methoden mit Spock
Wie man jeden Fall mit PowerMock + Mockito1x verspottet
MOCKEN Sie die Konstruktoren anderer Klassen mit Spring MVC + PowerMock + Junit
[Java] JavaConfig mit statischer innerer Klasse
Verspotten und spionieren Sie PowerMock aus
Deaktivieren Sie den statischen Initialisierer in PowerMock
Verarbeitungsgeschwindigkeit mit und ohne statische Aufladung
[Ruby] Behandeln Sie Instanzvariablen mit Instanzmethoden
[Java] Testen Sie private Methoden mit JUnit