Je suis actuellement en train d'utiliser Mockito pour simuler mes objets de couche de service dans une application Spring MVC dans laquelle je veux tester mes méthodes de contrôleur. Cependant, comme je l'ai lu sur les spécificités de Mockito, j'ai trouvé que les méthodes étaient doReturn(...).when(...)
équivalentes à when(...).thenReturn(...)
. Donc, ma question est quel est l'intérêt d'avoir deux méthodes qui font la même chose ou quelle est la différence subtile entre doReturn(...).when(...)
et when(...).thenReturn(...)
?
Toute aide serait appréciée.
java
unit-testing
mockito
panthère noire
la source
la source
doReturn()
est utile.Réponses:
Les deux syntaxes pour le stubbing sont à peu près équivalentes. Cependant, vous pouvez toujours utiliser
doReturn/when
pour le tronçonnage; mais il y a des cas où vous ne pouvez pas utiliserwhen/thenReturn
. Les méthodes de stubbing void en font partie. D'autres incluent l'utilisation avec des espions Mockito et le tronçonnage de la même méthode plus d'une fois.Une chose qui
when/thenReturn
vous donne, cedoReturn/when
n'est pas le cas, est la vérification de type de la valeur que vous retournez, au moment de la compilation. Cependant, je crois que cela n'a presque aucune valeur - si vous avez un mauvais type, vous le saurez dès que vous exécuterez votre test.Je recommande fortement d'utiliser uniquement
doReturn/when
. Il ne sert à rien d'apprendre deux syntaxes quand on le fera.Vous voudrez peut-être vous référer à ma réponse à Forming Mockito "grammars" - une réponse plus détaillée à une question très proche.
la source
doReturn/when
et passe les prochaines minutes à comprendre ce qui ne va pas. La vérification du type de type de compilation devient extrêmement utile avecwhen/thenReturn
.when/thenReturn
au lieu dedoReturn/when
.doReturn/when
c'est un compromis. L'équipe ne recommande pas d'une manière ou d'une autre mais notez que l'when/then
approche est plus intuitive, plus lisible et offre une vérification du temps de compilation, c'est l'approche qui a rendu Mockito populaire et facile à utiliser, n'oubliez pas que lorsque la base de code est partagée par compétences diverses dans votre équipe; pourtant, il présente des inconvénients concernant les espions et les méthodes de nullité.doReturn()
a le gros inconvénient de se transformer en codage de style YODA des appels de méthode. La chose est ensuite écrite en premier. La plupart des gens lisent de gauche à droite; vous devez donc vous rappeler constamment d'inverser la logique de retour dans votre tête.Les deux approches se comportent différemment si vous utilisez un objet espion (annoté avec
@Spy
) au lieu d'une maquette (annoté avec@Mock
):when(...) thenReturn(...)
effectue un véritable appel de méthode juste avant que la valeur spécifiée ne soit renvoyée. Donc, si la méthode appelée lève une exception, vous devez y faire face / la mocker etc. Bien sûr, vous obtenez toujours votre résultat (ce que vous définissez dansthenReturn(...)
)doReturn(...) when(...)
n'appelle pas du tout la méthode .Exemple:
Tester:
la source
doReturn()
, cela ressemble à un abus de la bibliothèque. L'intérêt d'espionner au lieu de se moquer purement est de profiter de vrais appels. Ils mettent également en garde contre l'utilisation d'espions comme ceci: github.com/mockito/mockito/wiki/Using-Spies-(and-Fakes) (et recommandent d'étendre la classe et de remplacer la méthode à la place)Le javadoc Mockito semble dire pourquoi utiliser
doReturn()
au lieu d'when()
utiliser Utiliser doReturn () dans les rares occasions où vous ne pouvez pas utiliser Mockito.when (Object).la source
Poursuivant cette réponse , il y a une autre différence que si vous voulez que votre méthode retourne des valeurs différentes par exemple quand elle est appelée pour la première fois, pour la deuxième fois, etc., vous pouvez passer des valeurs donc par exemple ...
Ainsi, elle renverra false lorsque la méthode est appelée dans le même scénario de test, puis elle renverra à nouveau et enfin true.
la source
Cette dernière alternative est utilisée pour les méthodes sur les simulations qui reviennent
void
.Veuillez jeter un œil, par exemple, ici: Comment faire des méthodes de mock to void avec mockito
la source