Se moquer des méthodes privées pour tester avec PowerMock
Tester des classes avec des méthodes privées peut être difficile, en particulier lorsque l'on essaie d'assumer le comportement correct de ces méthodes . PowerMock propose une solution pour cela, mais pour certains utilisateurs, elle peut ne pas fonctionner comme prévu. Ici, nous allons explorer une approche possible utilisant une combinaison de Mockito et PowerMock pour réussir à simuler les méthodes privées.
Approche :
Le principal outil que nous utiliserons est Méthode when de Mockito pour spécifier le comportement de la méthode privée. Pour accéder à la méthode privée, nous utiliserons la fonction Spy de PowerMock. Cela nous permet de créer un objet espion qui intercepte les appels à la méthode privée et nous permet de nous moquer de son comportement.
Exemple :
Considérons la classe suivante, CodeWithPrivateMethod, qui a une méthode privée doTheGamble.
<code class="java">public class CodeWithPrivateMethod { public void meaningfulPublicApi() { if (doTheGamble("Whatever", 1 << 3)) { throw new RuntimeException("boom"); } } private boolean doTheGamble(String whatever, int binary) { Random random = new Random(System.nanoTime()); boolean gamble = random.nextBoolean(); return gamble; } }</code>
Test :
En utilisant l'approche décrite, nous pouvons écrire un test JUnit qui se moque de la méthode privée et affirme la méthode souhaitée comportement.
<code class="java">import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.powermock.api.mockito.PowerMockito.when; import static org.powermock.api.support.membermodification.MemberMatcher.method; @RunWith(PowerMockRunner.class) @PrepareForTest(CodeWithPrivateMethod.class) public class CodeWithPrivateMethodTest { @Test(expected = RuntimeException.class) public void when_gambling_is_true_then_always_explode() { CodeWithPrivateMethod spy = PowerMockito.spy(new CodeWithPrivateMethod()); when(spy, method(CodeWithPrivateMethod.class, "doTheGamble", String.class, int.class)) .withArguments(anyString(), anyInt()) .thenReturn(true); spy.meaningfulPublicApi(); } }</code>
Dans ce test, nous créons un objet espion et nous moquons de la méthode doTheGamble en utilisant when. Nous spécifions que pour toute entrée, la méthode doit toujours renvoyer true. Par conséquent, lorsque la méthode MeaningPublicApi est appelée, le test s'attend à ce que le code lève une RuntimeException en raison du comportement simulé de la méthode privée.
Cette approche combine la puissance de Mockito pour se moquer et de PowerMock pour accéder à des méthodes privées. méthodes, fournissant une solution complète pour tester le code qui repose sur des méthodes privées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!