Méthodes factices de Mockito

Mockito Mock Méthodes

1. Vue d'ensemble

Ce didacticiel illustre diverses utilisations des méthodes statiques standardmock de l'APIMockito.

Comme pour d'autres articles axés sur le framework Mockito (commeMockito Verify ouMockito When/Then), la classeMyList ci-dessous sera utilisée comme collaborateur à simuler dans les cas de test:

public class MyList extends AbstractList {
    @Override
    public String get(int index) {
        return null;
    }

    @Override
    public int size() {
        return 1;
    }
}

2. Mocking simple

La variante surchargée la plus simple de la méthodemock est celle avec un seul paramètre pour la classe à simuler:

public static  T mock(Class classToMock)

Nous allons utiliser cette méthode pour simuler une classe et définir une attente:

MyList listMock = mock(MyList.class);
when(listMock.add(anyString())).thenReturn(false);

Puis exécutez une méthode sur la maquette:

boolean added = listMock.add(randomAlphabetic(6));

Le code suivant confirme que la méthodeadd a été invoquée sur le simulacre et que l'appel renvoie une valeur qui correspond à l'attente que nous avons définie auparavant:

verify(listMock).add(anyString());
assertThat(added, is(false));

3. Se moquer avec le nom de simulacre

Dans cette section, nous allons couvrir une autre variante de la méthodemock qui est fournie avec un argument spécifiant le nom du mock:

public static  T mock(Class classToMock, String name)

D'une manière générale, le nom d'une maquette n'a rien à voir avec le code de travail, mais peut être utile en matière de débogage, où le nom de la maquette est utilisé pour détecter les erreurs de vérification.

Pour nous assurer que le nom fourni d'une maquette est inclus dans le message d'une exception lancée suite à une vérification infructueuse, nous nous baserons sur une implémentation JUnit de l'interfaceTestRule, appeléeExpectedException, et l'inclurons dans une classe de test:

@Rule
public ExpectedException thrown = ExpectedException.none();

Cette règle sera utilisée pour gérer les exceptions émises par les méthodes de test.

Dans le code suivant, nous créons une maquette pour la classeMyList et la nommonsmyMock:

MyList listMock = mock(MyList.class, "myMock");

Ensuite, définissez une attente sur une méthode de la maquette et exécutez-la:

when(listMock.add(anyString())).thenReturn(false);
listMock.add(randomAlphabetic(6));

Nous allons créer une vérification intentionnellement échouée qui devrait générer une exception avec le message contenant des informations sur le modèle. Pour ce faire, les attentes concernant l'exception doivent d'abord être définies:

thrown.expect(TooLittleActualInvocations.class);
thrown.expectMessage(containsString("myMock.add"));

La vérification suivante doit échouer et générer une exception correspondant à ce qui était attendu:

verify(listMock, times(2)).add(anyString());

Voici le message de l'exception lancée:

org.mockito.exceptions.verification.TooLittleActualInvocations:
myMock.add();
Wanted 2 times:
at com.example.mockito.MockitoMockTest
  .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...)
but was 1 time:
at com.example.mockito.MockitoMockTest
  .whenUsingMockWithName_thenCorrect(MockitoMockTest.java:...)

Comme nous pouvons le voir, le nom de la maquette a été inclus dans le message d'exception, ce qui sera utile pour trouver le point d'échec en cas d'échec de la vérification.

4. Se moquer avecAnswer

Ici, nous allons démontrer l’utilisation d’une variantemock dans laquelle la stratégie des réponses simulées à l’interaction est configurée au moment de la création. La signature de cette méthodemock dans la documentation Mockito ressemble à ceci:

public static  T mock(Class classToMock, Answer defaultAnswer)

Commençons par la définition d'une implémentation de l'interfaceAnswer:

class CustomAnswer implements Answer {
    @Override
    public Boolean answer(InvocationOnMock invocation) throws Throwable {
        return false;
    }
}

La classeCustomAnswer ci-dessus est utilisée pour la génération d'une maquette:

MyList listMock = mock(MyList.class, new CustomAnswer());

Si nous ne définissons pas une attente sur une méthode, la réponse par défaut, qui a été configurée par le typeCustomAnswer, entrera en jeu. Afin de le prouver, nous ignorerons l'étape de définition des attentes et passerons à l'exécution de la méthode:

boolean added = listMock.add(randomAlphabetic(6));

La vérification et l'assertion suivantes confirment que la méthodemock avec un argumentAnswer a fonctionné comme prévu:

verify(listMock).add(anyString());
assertThat(added, is(false));

5. Se moquer avecMockSettings

La dernière méthodemock traitée dans cet article est la variante avec un paramètre de typeMockSettings. Cette méthode surchargée est utilisée pour fournir une maquette non standard.

Il existe plusieurs paramètres personnalisés pris en charge par les méthodes de l'interfaceMockSettings, tels que l'enregistrement d'un écouteur pour les appels de méthode sur la maquette actuelle avecinvocationListeners, la configuration de la sérialisation avecserializable, la spécification de l'instance pour espionner avecspiedInstance, configurer Mockito pour tenter d'utiliser un constructeur lors de l'instanciation d'un simulacre avecuseConstructor, et quelques autres.

Pour plus de commodité, nous réutiliserons la classeCustomAnswer introduite dans la section précédente pour créer une implémentationMockSettings qui définit une réponse par défaut.

Un objetMockSettings est instancié par une méthode de fabrique comme suit:

MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer());

Cet objet de paramètre sera utilisé dans la création d'un nouveau modèle:

MyList listMock = mock(MyList.class, customSettings);

Comme dans la section précédente, nous allons invoquer la méthodeadd d'une instanceMyList et vérifier qu'une méthodemock avec un argumentMockSettings fonctionne comme prévu en utilisant l'extrait de code suivant:

boolean added = listMock.add(randomAlphabetic(6));
verify(listMock).add(anyString());
assertThat(added, is(false));

6. Conclusion

Ce tutoriel a couvert en détail la méthodemock de Mockito. L'implémentation de ces exemples et extraits de code se trouve dansa GitHub project.