Mit PowerMock können Sie die Enum-Klasse verspotten und Testcode in JUnit schreiben.
Ausführung | |
---|---|
Java | 8 |
JUnit | 4.12 |
Mockito | 2.23 |
PowerMock | 2.0.2 |
public enum SampleEnum {
ELEM1("val1"),
ELEM2("val2");
private String val;
private SampleEnum(String val) {
this.val = val;
}
public String getVal() {
return this.val;
}
}
@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);
}
}
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.
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