[JAVA] Mock Enum mit PowerMock

Überblick

Mit PowerMock können Sie die Enum-Klasse verspotten und Testcode in JUnit schreiben.

Umgebung

Ausführung
Java 8
JUnit 4.12
Mockito 2.23
PowerMock 2.0.2

Liste der verwendeten Bibliotheken

Beispielcode

Verspottende Zielklasse

public enum SampleEnum {
	
	ELEM1("val1"),
	ELEM2("val2");
	
	private String val;
	
	private SampleEnum(String val) {
		this.val = val;
	}
	
	public String getVal() {
		return this.val;
	}
}

Testklasse

@RunWith(PowerMockRunner.class)
@PrepareForTest(SampleEnum.class)
public class SampleEnumTest {

	@Test
	public void test() throws Exception {

		//Erwarteter Wert
		String expected_elem1 = "test";
		String expected_elem2 = "val2";

		//Mock Enum
		SampleEnum mocked = Mockito.mock(SampleEnum.class);

		//Legen Sie den Rückgabewert in der Methode fest und machen Sie ihn stub
		Mockito.when(mocked.getVal()).thenReturn(expected_elem1);
		//Wenn nicht stub
		// Mockito.when(mocked.getVal()).thenCallRealMethod();

		//Legen Sie ein verspottetes Objekt im Element Enum fest
		Whitebox.setInternalState(SampleEnum.class, "ELEM1", mocked);

		//Lauf
		String actual_elem1 = SampleEnum.ELEM1.getVal(); // "test"Kehrt zurück
		String actual_elem2 = SampleEnum.ELEM2.getVal(); // "val2"Kehrt zurück

		//Überprüfen Sie das Ergebnis
		assertEquals(expected_elem1, actual_elem1);
		assertEquals(expected_elem2, actual_elem2);
	}
}

Punkt ①

Tatsächlich verwendet das Mocking of Enum selbst nicht die PowerMock-Bibliothek. Es kann mit der Mockito-Bibliothek verspottet werden, z. B. "Mockito.mock (SampleEnum.class)". (PowerMockito.mock und PowerMockito.when können auch anstelle von Mockito verwendet werden.)

Der Punkt ist, PowerMockRunnner.class in @ Runwith anzugeben und die Enum-Klasse zu beschreiben, die Sie in @ PrepareForTest verspotten möchten.

Danach können Sie den Rückgabewert mit "thenReturn ()" festlegen oder die eigentliche Methode aufrufen, ohne mit "thenCallRealMethod ()" zu stubben.

Wenn Sie versuchen, "@ Runwith" und "@ PrepareForTest" zu kommentieren und auszuführen, wird das folgende Fehlerprotokoll ausgegeben.

org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy class jp.co.sample_powermock.enumtest.SampleEnum
Mockito cannot mock/spy because :
 - final class

Der JUnit4-Testläufer scheint das Verspotten der Enum-Klasse nicht zu unterstützen.

Punkt ②

Jede Enum-Konstante kann als Instanz von Enum betrachtet werden. Durch Einfügen eines verspotteten Enum-Objekts in jede dieser Instanzen kann Enum verspottet werden.

Der Beispielcode verwendet die PowerMock-Bibliothek "Whitebox.setInternalState ()", um ein Scheinobjekt in das Element "ELEM1" von Enum einzufügen.

Infolgedessen verhält sich "SampleEnum.ELEM1" wie das gesetzte Scheinobjekt und "SampleEnum.ELEM2" wie es ist.

Sie können das Scheinobjekt in java.lang.reflect festlegen, ohne Whitebox zu verwenden, aber ich denke, die Verwendung von Whitebox vereinfacht Ihren Code.

Recommended Posts

Mock Enum mit PowerMock
Verspotten Sie statische Methoden mit PowerMock
Verspotten Sie den Konstruktor mit PowerMock
Wie man jeden Fall mit PowerMock + Mockito1x verspottet
Verspotten und spionieren Sie PowerMock aus
MOCKEN Sie die Konstruktoren anderer Klassen mit Spring MVC + PowerMock + Junit
Verspotten Sie nur einige Methoden mit Spock
Punkt 38: Emulieren erweiterbarer Enums mit Schnittstellen
Verwenden Sie FacesContext als Mock mit PowerMockito