Maison >Java >javaDidacticiel >Mockito : `doReturn()` contre `when()` : quand dois-je utiliser lequel ?

Mockito : `doReturn()` contre `when()` : quand dois-je utiliser lequel ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-28 03:44:10927parcourir

Mockito: `doReturn()` vs. `when()`: When Should I Use Which?

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

Il est compréhensible de rencontrer une confusion entre doReturn() de Mockito... méthodes when() et when()...thenReturn(), car elles peuvent sembler faire la même chose. Bien que les deux puissent simuler des appels de méthode et renvoyer des valeurs prédéfinies, il existe une distinction subtile qui devient pertinente lors de l'utilisation d'objets espionnés (annotés avec @Spy) au lieu de simulacres (annotés avec @Mock).

La clé Différence : comportement d'invocation de méthode

La différence cruciale réside dans la façon dont ces méthodes se comportent lors de l'interaction avec des espions. objets :

  • when()...thenReturn() effectue un véritable appel de méthode avant de renvoyer la valeur spécifiée. Cela signifie que toutes les exceptions levées par la méthode réelle devront toujours être gérées.
  • doReturn()...when() n'appelle pas du tout la méthode. Au lieu de cela, il renvoie directement la valeur prédéfinie. Cela contourne toute invocation de méthode réelle.

Exemple pour illustrer la différence :

Considérez le code suivant :

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

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

Test avec un objet espionné :

@Spy
private MyClass myClass;

// ...

// This approach will work without throwing an exception
doReturn("test").when(myClass).anotherMethodInClass();

// This approach will throw a NullPointerException
when(myClass.anotherMethodInClass()).thenReturn("test");

Avec un objet espionné, when()...thenReturn() tente d'appeler anotherMethodInClass() qui lancera une NullPointerException. En revanche, doReturn()...when() évite d'appeler la méthode et renvoie directement "test", supprimant l'exception.

Conclusion

La différence entre ces deux méthodes apparaissent lors de l’utilisation d’objets espionnés. Pour les objets espionnés, doReturn()...when() offre un meilleur contrôle en contournant les appels de méthode réels et en renvoyant directement les valeurs prédéfinies. En revanche, when()...thenReturn() appelle les vraies méthodes, ce qui peut conduire à des exceptions ou à d'autres comportements involontaires. Ainsi, le choix de la méthode appropriée dépend du comportement souhaité et du fait que vous utilisez un objet simulé ou espionné.

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