Maison >Java >javaDidacticiel >Mockito : `doReturn()` vs `when()` : quand devriez-vous utiliser Which avec des objets espionnés ?

Mockito : `doReturn()` vs `when()` : quand devriez-vous utiliser Which avec des objets espionnés ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-28 18:19:151109parcourir

Mockito: `doReturn()` vs. `when()`: When Should You Use Which with Spied Objects?

Mockito : Comprendre la différence subtile entre doReturn() et when()

Lors de l'utilisation du framework moqueur Mockito pour améliorer les capacités de test, les développeurs rencontrent souvent doReturn() et les méthodes when(). Bien que les deux méthodes servent à supprimer les invocations de méthodes, une distinction subtile existe entre elles lorsque vous travaillez avec des objets espionnés (annotés avec @Spy).

when(...).thenReturn(...) vs doReturn(...).when(...)

when(...).thenReturn(...):

  • Fait un véritable appel de méthode avant de renvoyer la valeur spécifiée.
  • Si la méthode appelée lève une exception, elle doit être gérée ou moquée séparément.

doReturn(...).when(...):

  • Évite entièrement l'appel de méthode réel.

Exemple pratique

Considérez ce qui suit MyClass :

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

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

Test avec Spy

doReturn(...).when(...):

@Spy
private MyClass myClass;

// Works as expected
doReturn("test").when(myClass).anotherMethodInClass();

when(...).thenReturn(...):

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

Dans ce scénario, doReturn() garantit que l'exception dans anotherMethodInClass() est évitée tout en renvoyant la valeur souhaitée. En revanche, when() déclenche l'appel de méthode réel, ce qui entraîne la levée de l'exception NullPointerException.

Par conséquent, lorsque vous travaillez avec des objets espionnés, le choix entre doReturn() et when() dépend si vous souhaitez invoquer la méthode actuelle ou la contourner complètement.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn