Se moquer ou espionner dans des frameworks moqueurs

Dans les frameworks moqueurs, vous pouvez simuler un object ou l’espionner. Quelle est la différence entre les deux et quand / devrais-je utiliser l’un sur 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 entre les deux.

L’object simulé remplace entièrement la classe simulée, renvoyant les 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 object existant et “remplacez” seulement certaines méthodes. Ceci est utile lorsque vous avez une grande classe et que vous voulez seulement vous moquer de certaines méthodes (moquage partiel). Permettez-moi de citer la documentation Mockito :

Vous pouvez créer des espions d’objects réels. Lorsque vous utilisez l’espion, alors les vraies méthodes sont appelées (à moins qu’une méthode ne soit écrasée).

Les vrais espions doivent être utilisés avec précaution et à l’occasion , par exemple lors de l’utilisation de code hérité.

En cas de doute, utilisez des simulacres.

Mockito prévient que les moqueries partielles ne sont pas une bonne pratique et vous devriez revoir votre architecture OO. Spy (ou moqueur partiel) est recommandé pour tester le code hérité.

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 des objects réels, dans laquelle nous avons ajouté un élément et la taille attendue pour en être un.

nous identifions un object réel, ce qui signifie que nous pouvons indiquer quelle méthode doit être écrasée. Nous avons donc déclaré que nous avons écrasé la méthode – size () sur un object espion qui renverrait 10, quelle que soit la taille réelle.

En bref, vous allez espionner les objects réels et stub certaines des méthodes.

On peut se moquer partiellement à la fois en espionnant et en mocking. Pour le simulacre, nous utilisons thenCallRealMethod pour appeler la méthode réelle où, comme espion par défaut, appelle la méthode réelle. Ainsi, tous deux atteignent le même objective de moquage partiel. Cependant, il est recommandé d’utiliser Spy pour des moqueries partielles.

Lorsque nous utilisons Mock, l’instance d’object réelle n’est pas créée, mais l’instance de shell bare-bones de la classe est créée pour suivre les interactions. Alors qu’en cas d’espionnage, nous créons nous-même l’instance d’object à utiliser par l’espion. Donc, utiliser Mockito Spy garantit que les vraies méthodes sont appelées correctement.

Par exemple-

 public class EmployeePaymentService { EmployeePaymentService( final NamedParameterJdbcTemplate namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParameterJdbcTemplate; } public int getNoOfWorkingDays(Ssortingng empId) { //call some query int days=namedParameterJdbcTemplate.query(); return days; } } 

Si pour un cas de test unitaire, nous simulons partiellement le EmployeePaymentService ci-dessus en utilisant Mock as-

 @Mock private EmployeePaymentService employeePaymentService; 

et plus tard appeler la méthode réelle getNoOfWorkingDays en utilisant thenCallRealMethod comme suit –

 when(employeePaymentService.getNoOfWorkingDays(anySsortingng())).thenCallRealMethod(); int returnedWrkingDays = employeePaymentService.getNoOfWorkingDays(empId); 

Nous obtenons une exception java.lang.NullPointerException dans la méthode getNoOfWorkingDays, car le paramètre namedParameterJdbcTemplate n’a jamais été initialisé. Cependant, si nous utilisions le Spy Mockito, ce scénario ne se poserait jamais, car nous aurions nous-mêmes créé EmployeePaymentService en utilisant un constructeur avec namedJdbcTemplate.

Pour plus de détails vérifier ce post

Les espions ont deux définitions. Premièrement, la méthode réelle est appelée, une autre où aucune fonctionnalité n’est appelée et seules les valeurs équivalentes nulles ou nulles sont renvoyées, mais les méthodes ont été appelées et leur état a été enregistré.

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

Lorsque vous utilisez des objects fictifs, le comportement par défaut de la méthode lorsque ce n’est pas le cas est de ne rien faire. Simple signifie, si c’est une méthode vide, alors elle ne fera rien lorsque vous appelez la méthode ou si c’est une méthode avec un retour, alors elle peut retourner null, vide ou la valeur par défaut.

Bien que dans les objects espions, bien sûr, comme il s’agit d’une méthode réelle, lorsque vous ne limitez pas la méthode, elle appellera le comportement de la méthode réelle. Si vous souhaitez modifier et simuler la méthode, vous devez la modifier.