Comment se moquer des méthodes avec un type de retour vide?
J'ai implémenté un modèle d'observateur mais je ne peux pas me moquer de lui avec Mockito parce que je ne sais pas comment.
Et j'ai essayé de trouver un exemple sur Internet mais je n'ai pas réussi.
Ma classe ressemble à ceci:
public class World {
List<Listener> listeners;
void addListener(Listener item) {
listeners.add(item);
}
void doAction(Action goal,Object obj) {
setState("i received");
goal.doAction(obj);
setState("i finished");
}
private string state;
//setter getter state
}
public class WorldTest implements Listener {
@Test public void word{
World w= mock(World.class);
w.addListener(this);
...
...
}
}
interface Listener {
void doAction();
}
Le système n'est pas déclenché avec une simulation.
Je veux montrer l'état du système mentionné ci-dessus. Et faites des affirmations selon eux.
Réponses:
Jetez un œil aux documents de l' API Mockito . Comme le document lié mentionne (point n ° 12) , vous pouvez utiliser l' une des
doThrow()
,doAnswer()
,doNothing()
,doReturn()
famille de méthodes de cadre Mockito pour se moquer des méthodes vides.Par exemple,
ou si vous souhaitez le combiner avec un comportement de suivi,
En supposant que vous envisagez de vous moquer du setter
setState(String s)
dans la classe World ci-dessous, le code utilise ladoAnswer
méthode pour se moquer desetState
.la source
setRate()
c'estfinal
et ne peut donc pas être moqué. Essayez plutôtcreate()
une instance qui fait ce dont vous avez besoin. Il ne devrait pas être nécessaire de se moquerRateLimiter
.Je pense que j'ai trouvé une réponse plus simple à cette question, pour appeler la vraie méthode pour une seule méthode (même si elle a un retour nul), vous pouvez le faire:
Ou, vous pouvez appeler la vraie méthode pour toutes les méthodes de cette classe, en procédant comme suit:
la source
Ajoutant à ce que @sateesh a dit, lorsque vous souhaitez simplement simuler une méthode void afin d'empêcher le test de l'appeler, vous pouvez utiliser
Spy
cette méthode:Lorsque vous souhaitez exécuter votre test, assurez-vous d'appeler la méthode en test sur l'
spy
objet et non sur l'world
objet. Par exemple:la source
La solution du soi-disant problème consiste à utiliser un
spy
Mockito.spy (...) au lieu d'unmock
Mockito.mock (..) .Spy nous permet de nous moquer partiellement. Mockito est bon dans ce domaine. Parce que vous avez une classe qui n'est pas complète, vous vous moquez ainsi de la place requise dans cette classe.
la source
Tout d'abord: vous devez toujours importer mockito static, de cette façon le code sera beaucoup plus lisible (et intuitif):
Pour des moqueries partielles tout en conservant les fonctionnalités d'origine sur le reste, mockito propose "Spy".
Vous pouvez l'utiliser comme suit:
Pour éliminer l'exécution d'une méthode, vous pouvez utiliser quelque chose comme ceci:
pour donner un comportement personnalisé à une méthode, utilisez "when" avec un "thenReturn":
Pour plus d'exemples, veuillez trouver les excellents échantillons de mockito dans la doc.
la source
Comment se moquer des méthodes void avec mockito - il y a deux options:
doAnswer
- Si nous voulons que notre méthode void moquée fasse quelque chose (moquer le comportement malgré le fait d'être nul).doThrow
- Ensuite, il y aMockito.doThrow()
si vous voulez lever une exception de la méthode void moquée.Voici un exemple de la façon de l'utiliser (pas un cas d'utilisation idéal, mais je voulais juste illustrer l'utilisation de base).
Vous pouvez trouver plus de détails sur la façon de se moquer et de tester les méthodes de vide avec Mockito dans mon article Comment se moquer avec Mockito (Un guide complet avec des exemples)
la source
Ajout d'une autre réponse au groupe (sans jeu de mots) ...
Vous devez appeler la méthode doAnswer si vous ne pouvez pas \ ne voulez pas utiliser espion. Cependant, vous n'avez pas nécessairement besoin de lancer votre propre réponse . Il existe plusieurs implémentations par défaut. Notamment, CallsRealMethods .
En pratique, cela ressemble à ceci:
Ou:
la source
Dans Java 8, cela peut être rendu un peu plus propre, en supposant que vous ayez une importation statique pour
org.mockito.Mockito.doAnswer
:Le
return null;
est important et sans lui, la compilation échouera avec des erreurs assez obscures car elle ne pourra pas trouver un remplacement appropriédoAnswer
.Par exemple, un
ExecutorService
qui exécute immédiatement toutRunnable
passéexecute()
peut être implémenté en utilisant:la source
Je pense que vos problèmes sont dus à votre structure de test. J'ai trouvé difficile de mélanger la simulation avec la méthode traditionnelle d'implémentation des interfaces dans la classe de test (comme vous l'avez fait ici).
Si vous implémentez l'écouteur en tant que maquette, vous pouvez alors vérifier l'interaction.
Cela devrait vous convaincre que le «monde» fait la bonne chose.
la source
Utiliser Mockito.doThrow comme dans:
vous pouvez essayer ce bel exemple:
Source: http://apisonar.com/java-examples/org.mockito.Mockito.doThrow.html#Example-19
la source