Je suis nouveau chez Mockito.
Étant donné la classe ci-dessous, comment puis-je utiliser Mockito pour vérifier qu'il a someMethod
été invoqué exactement une fois après avoir foo
été invoqué?
public class Foo
{
public void foo(){
Bar bar = new Bar();
bar.someMethod();
}
}
Je souhaite effectuer l'appel de vérification suivant,
verify(bar, times(1)).someMethod();
où bar
est une instance moquée de Bar
.
Réponses:
Injection de dépendance
Si vous injectez l'instance Bar, ou une fabrique utilisée pour créer l'instance Bar (ou l'une des 483 autres façons de procéder), vous aurez l'accès nécessaire pour effectuer le test.
Exemple d'usine:
Étant donné une classe Foo écrite comme ceci:
dans votre méthode de test, vous pouvez injecter une BarFactory comme ceci:
Bonus: Ceci est un exemple de la façon dont TDD peut piloter la conception de votre code.
la source
Bar bar = mock(Bar.class)
au lieu deBar bar = new Bar();
BarFactory myFactory = mock(BarFactory.class); when(myFactory.createBar()).thenReturn(bar);
La réponse classique est: "Vous ne le faites pas." Vous testez l'API publique de
Foo
, pas ses internes.Y a-t-il un comportement de l'
Foo
objet (ou, moins bien, un autre objet dans l'environnement) qui est affecté parfoo()
? Si oui, testez cela. Et sinon, que fait la méthode?la source
Foo
ispublic void foo()
, où les éléments internes sont uniquement liés à la barre.verify()
devenez très utiles en effet, même si vous n'adorez plus au saint autel des tests d'intégration.Si vous ne souhaitez pas utiliser DI ou les usines. Vous pouvez remanier votre classe d'une manière un peu délicate:
Et votre classe de test:
Ensuite, la classe qui appelle votre méthode foo le fera comme ceci:
Comme vous pouvez le voir lorsque vous appelez la méthode de cette façon, vous n'avez pas besoin d'importer la classe Bar dans une autre classe qui appelle votre méthode foo, ce qui est peut-être quelque chose que vous voulez.
Bien sûr, l'inconvénient est que vous autorisez l'appelant à définir l'objet Bar.
J'espère que ça aide.
la source
Solution pour votre exemple de code en utilisant
PowerMockito.whenNew
FooTest.java
Sortie JUnit
la source
Je pense que Mockito
@InjectMocks
est la voie à suivre.Selon votre intention, vous pouvez utiliser:
Plus d'informations dans les documents
Voici un exemple avec injection de champ:
Des classes:
Tester:
la source
Oui, si vous voulez / devez vraiment le faire, vous pouvez utiliser PowerMock. Cela devrait être considéré comme un dernier recours. Avec PowerMock, vous pouvez lui faire renvoyer une maquette de l'appel au constructeur. Faites ensuite la vérification sur la maquette. Cela dit, csturtz est la «bonne» réponse.
Voici le lien vers Mock construction de nouveaux objets
la source
Une autre façon simple serait d'ajouter une instruction log à bar.someMethod () puis de vérifier que vous pouvez voir ledit message lorsque votre test est exécuté, voir des exemples ici: Comment faire une assertion JUnit sur un message dans un enregistreur
C'est particulièrement pratique lorsque votre Bar.someMethod () l'est
private
.la source