[JAVA] Mock Enum avec PowerMock

Aperçu

Avec PowerMock, vous pouvez vous moquer de la classe Enum et écrire du code de test dans JUnit.

environnement

version
Java 8
JUnit 4.12
Mockito 2.23
PowerMock 2.0.2

Liste des bibliothèques utilisées

Exemple de code

Classe cible moqueuse

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

Classe d'essai

@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);
	}
}

Point ①

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.

Point ②

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

Mock Enum avec PowerMock
Méthodes statiques simulées avec PowerMock
Mock le constructeur avec PowerMock
Comment se moquer de chaque cas avec PowerMock + Mockito1x
Mock et espionner PowerMock
MOCK les constructeurs d'autres classes avec Spring MVC + PowerMock + Junit
Mock seulement quelques méthodes avec Spock
Point 38: émuler des énumérations extensibles avec des interfaces
Utilisez FacesContext comme maquette avec PowerMockito