Se moquer des appels de méthodes spécifiques dans les superclasses avec Mockito
Dans les scénarios de test, il peut être nécessaire de se moquer uniquement des appels de méthodes spécifiques dans une superclasse tout en préserver le comportement original des autres. Ceci peut être réalisé en utilisant les capacités de simulation flexibles de Mockito.
Considérez la hiérarchie de classes suivante :
<code class="java">class BaseService { public void save() {...} } class ChildService extends BaseService { public void save() { // Custom logic super.save(); } }</code>
Dans cet exemple, nous voulons nous moquer uniquement de l'appel à super.save() dans ChildService. tout en permettant l'exécution de l'implémentation originale de save() dans BaseService.
Pour y parvenir, nous pouvons utiliser la fonction espion pour créer un proxy de ChildService :
<code class="java">ChildService classToTest = Mockito.spy(new ChildService());</code>
Ensuite, nous besoin de supprimer le comportement de super.save() dans le contexte de ChildService. Cependant, puisque super fait référence à la classe BaseService dans ChildService, nous devons convertir classToTest en BaseService avant d'utiliser Mockito.doNothing().
<code class="java">Mockito.doNothing().when((BaseService)classToTest).validate();</code>
En supprimant la méthode validate() de BaseService, nous empêchons efficacement d'être appelé pendant le test. Par conséquent, seul l'appel super.save() dans ChildService sera intercepté par le mock.
Pour terminer le test, nous pouvons maintenant appeler save() sur classToTest et affirmer que la logique attendue dans ChildService est exécutée :
<code class="java">classToTest.save(); verify(classToTest).load();</code>
Cette approche nous permet de nous moquer sélectivement d'appels de méthodes spécifiques dans les superclasses tout en préservant la fonctionnalité des méthodes héritées. Cela s'avère utile dans les situations où la modification de la hiérarchie des classes ou la refactorisation du code n'est pas réalisable.
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!