web-dev-qa-db-fra.com

Moquer contre espionner dans des cadres moqueurs

Dans les frameworks moqueurs, vous pouvez vous moquer d'un objet ou l'espionner. Quelle est la différence entre les deux et quand devrais-je/devrais-je utiliser l'un plutôt que l'autre? En regardant mockito, par exemple, je vois des choses similaires se faire avec des espions et des moqueurs, mais je ne suis pas sûr de la distinction qui existe entre les deux.

112
Vivin Paliath

L'objet simulé remplace entièrement la classe simulée, en renvoyant des valeurs enregistrées ou par défaut. Vous pouvez créer des simulacres à partir de "l'air mince". C'est ce qui est principalement utilisé lors des tests unitaires.

En espionnant, vous prenez un objet existant et "ne remplacez" que certaines méthodes. Ceci est utile lorsque vous avez une classe énorme et que vous voulez seulement vous moquer de certaines méthodes (moqueries partielles). Laissez-moi citer documentation Mockito :

Vous pouvez créer des espions d'objets réels. Lorsque vous utilisez l'espion, les méthodes real sont appelées (sauf si une méthode a été stubée).

Les vrais espions doivent être utilisés avec précaution et occasionnellement , par exemple pour traiter du code hérité.

En cas de doute, utilisez des simulacres.

130
Tomasz Nurkiewicz

Mockito vous avertit que les moqueries partielles ne sont pas une bonne pratique et que vous devriez réviser votre architecture OO. Spy (ou les moqueries partielles) est recommandé pour tester le code hérité.

10
Suelmar Zanetti

Peut essayer d'expliquer en utilisant l'exemple ici.

// difference between mocking, stubbing and spying
@Test
public void differenceBetweenMockingSpyingAndStubbing(){
    List list = new ArrayList();
    list.add("abc");
    assertEquals(1,list.size());
    List mockedList = spy(list);
    when(mockedList.size()).thenReturn(10);
    assertEquals(10,mockedList.size());
}

Ici, nous avions la liste initiale d'objets réels, dans laquelle nous avons ajouté un élément et la taille attendue.

nous espionnons un objet réel, ce qui signifie que nous pouvons indiquer la méthode à utiliser. Nous avons donc déclaré que nous stubbed méthode-size () sur un objet espion qui renverra 10, quelle que soit la taille réelle.

en résumé, vous allez espionner des objets réels et décrire certaines des méthodes.

10
user2775185

Les espions ont deux définitions. L'une correspond à l'endroit où la méthode réelle est appelée, l'autre à aucune fonctionnalité n'est appelée et seules les valeurs nulles ou équivalentes sont renvoyées, mais les méthodes sont appelées et leur état est enregistré, comme si la méthode x était appelée y fois.

1
John Heilman

Référence: http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/

Lors de l'utilisation d'objets fictifs, le comportement par défaut de la méthode lorsqu'il n'est pas stub est ne rien faire. Un moyen simple, si sa méthode est vide, il ne fera rien lorsque vous appelez la méthode ou si c'est une méthode avec un retour, il peut renvoyer null, empty ou la valeur par défaut.

Bien qu’il s’agisse d’objets espions, bien sûr, étant donné qu’il s’agit d’une méthode réelle, elle appelle le comportement de la méthode réelle lorsque vous ne la remplacez pas. Si vous voulez changer et simuler la méthode, vous devez la stub.

1
Jerry C.