Question

Je suis actuellement en train d'utiliser Mockito pour se moquer de mes objets de couche de service dans une application Spring MVC dans laquelle je souhaite tester mes méthodes de contrôleur. Cependant, comme je l'ai lu sur les détails de Mockito, j'ai trouvé que les méthodes doReturn(...).when(...) est équivalent à when(...).thenReturn(...). Donc, ma question est de savoir 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.

Était-ce utile?

La solution

Les deux syntaxes pour le coup sont à peu près équivalentes. Cependant, vous pouvez toujours utilisation doReturn/when Pour SUBBING; Mais il y a des cas où vous ne peut pas utilisation when/thenReturn. Les méthodes de vide de Stubbing en sont une. D'autres incluent une utilisation avec des espions de Mockito et des coups de la même méthode plus d'une fois.

Une chose qui when/thenReturn vous donne, que doReturn/when Le fait, est le type 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 le type faux, vous le découvrirez dès que vous exécutez votre test.

Je recommande fortement d'utiliser uniquement doReturn/when. Il est inutile d'apprendre deux syntaxes quand on le fera.

Vous voudrez peut-être vous référer à ma réponse à Formant des "grammaires" simulées - Une réponse plus détaillée à une question très étroitement liée.

Autres conseils

Les deux approches se comportent différemment si vous utilisez un objet espionné (annoté avec @Spy) au lieu d'un simulation (annoté avec @Mock):

  • when(...) thenReturn(...) fait 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 jette une exception, vous devez y faire face / la moquez, etc. Bien sûr, vous obtenez toujours votre résultat (ce que vous définissez dans thenReturn(...))

  • doReturn(...) when(...) n'appelle pas du tout la méthode.

Exemple:

public class MyClass {
     protected String methodToBeTested() {
           return anotherMethodInClass();
     }

     protected String anotherMethodInClass() {
          throw new NullPointerException();
     }
}

Test:

@Spy
private MyClass myClass;

// ...

// would work fine
doReturn("test").when(myClass).anotherMethodInClass();

// would throw a NullPointerException
when(myClass.anotherMethodInClass()).thenReturn("test");

Le Mockito Javadoc semble dire pourquoi doReturn() à la place de when()Utilisez DoreTurn () dans les rares occasions où vous ne pouvez pas utiliser Mockito.When (objet).

Méfiez-vous que Mockito.When (Object) est toujours recommandé pour le coup car il s'agit d'un type d'argument et plus lisible (surtout lorsque vous trouvez des appels consécutifs).

Voici ces rares occasions où Doreturn () est utile:

1. Lors de l'espionnage d'objets réels et d'appeler de vraies méthodes sur un espion apporte des effets secondaires

List list = new LinkedList(); List spy = spy(list);

// Impossible: la méthode réelle est appelée SO SPY.get (0) lève IndexoutOfBoundSexception (la liste est encore vide)

when(spy.get(0)).thenReturn("foo");

// Vous devez utiliser doreTurn () pour le coup: doReturn("foo").when(spy).get(0);

2. Remplacement d'une exception précédente:

when(mock.foo()).thenThrow(new RuntimeException());

// Impossible: la méthode FOO ()-Stubbed () est appelée donc RuntimeException est lancée. when(mock.foo()).thenReturn("bar");

// Vous devez utiliser doreTurn () pour le coup:

doReturn("bar").when(mock).foo(); Les scénarios ci-dessus montrent un compromis de la syntaxe élégante de Mockito. Notez que les scénarios sont très rares, cependant. L'espionnage doit être sporadique et le dépassage d'exception primordial est très rare. Sans oublier que, en général, la dépassement de talon est une odeur de code potentielle qui souligne trop de coups.

Continu Cette réponse, Il y a une autre différence que si vous voulez que votre méthode renvoie différentes valeurs par exemple lors de l'appel, deuxième fois, vous pouvez passer des valeurs donc par exemple ...

PowerMockito.doReturn(false, false, true).when(SomeClass.class, "SomeMethod", Matchers.any(SomeClass.class));

Il reviendra donc faux lorsque la méthode sera appelée dans le même cas de test, puis il renverra à nouveau faux et enfin vrai.

Cette dernière alternative est utilisée pour des méthodes sur des simulations qui reviennent void.

Veuillez jeter un œil, par exemple, ici:Comment se moquer des méthodes d'annulation avec mockito

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top