Avec PowerMock, vous pouvez vous moquer de la classe Enum et écrire du code de test dans JUnit.
version | |
---|---|
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 {
//Valeur attendue
String expected_elem1 = "test";
String expected_elem2 = "val2";
//Mock Enum
SampleEnum mocked = Mockito.mock(SampleEnum.class);
//Définissez la valeur de retour dans la méthode et rendez-la stub
Mockito.when(mocked.getVal()).thenReturn(expected_elem1);
//Quand pas stub
// Mockito.when(mocked.getVal()).thenCallRealMethod();
//Définir un objet simulé dans l'élément Enum
Whitebox.setInternalState(SampleEnum.class, "ELEM1", mocked);
//Courir
String actual_elem1 = SampleEnum.ELEM1.getVal(); // "test"Retour
String actual_elem2 = SampleEnum.ELEM2.getVal(); // "val2"Retour
//Vérifiez le résultat
assertEquals(expected_elem1, actual_elem1);
assertEquals(expected_elem2, actual_elem2);
}
}
En fait, le Mocking of Enum lui-même n'utilise pas la bibliothèque PowerMock.
Il peut être simulé avec la bibliothèque Mockito, telle que Mockito.mock (SampleEnum.class)
.
(PowerMockito.mock et PowerMockito.when peuvent également être utilisés à la place de Mockito.)
Le but est de spécifier PowerMockRunnner.class dans @ Runwith
et de décrire la classe Enum que vous voulez simuler dans @ PrepareForTest
.
Après cela, vous pouvez définir la valeur de retour avec thenReturn ()
ou appeler la méthode réelle sans stubing avec thenCallRealMethod ()
.
Si vous essayez de commenter @ Runwith
et @ PrepareForTest
et de l'exécuter, le journal d'erreurs suivant sera généré.
org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class jp.co.sample_powermock.enumtest.SampleEnum
Mockito cannot mock/spy because :
- final class
Le lanceur de test JUnit4 ne semble pas prendre en charge la moquerie de la classe Enum.
Chaque constante Enum peut être considérée comme une instance d'Enum. En injectant un objet Enum simulé dans chacune de ces instances, Enum peut être simulé.
L'exemple de code utilise la bibliothèque PowerMock Whitebox.setInternalState ()
pour injecter un objet fictif dans l'élément "ELEM1" de Enum.
Par conséquent, «SampleEnum.ELEM1» se comporte comme l'objet fictif défini et «SampleEnum.ELEM2» se comporte comme il est.
Vous pouvez définir l'objet fictif dans java.lang.reflect
sans utiliser Whitebox, mais je pense que l'utilisation de Whitebox simplifie votre code.
Recommended Posts