GLO-4002 - Site du cours 2023

Temps estimé: 30 minutes

Exercices : Apprendre Mockito

À la page précédente, nous avons vu comment crée un Mock manuellement. Heureusement, il existe une librairie "Mockito" qui permet de faire ça automatiquement.

Voici les étapes à suivre:

Préparation

1. Créer un nouveau projet

Ouvrez votre IDE de préférence et créer un nouveau projet Java Maven avec JDK 8 ou une version plus récente. Assurez-vous également d'importer une version récente de JUnit et de Mockito dans la liste des dépendances Maven.

pom.xml:
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.6.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.5.2</version>
    <scope>test</scope>
</dependency>

2. Ajouter le code

Ajoutez le code des classes suivantes:

Dependency.java:
public class Dependency {
    public void acceptParameter(String param) {
        throw new RuntimeException("This should never be called!!");
    }

    public void refuseParameter(String param){
        throw new RuntimeException("This should never be called!!");
    }

    public String doSomething() {
        throw new RuntimeException("This should never be called!!");
    }
}
LearningMockito.java
public class LearningMockito {
    public void singleCall(Dependency dependency) {
        dependency.doSomething();
    }

    public void twoCalls(Dependency dependency) {
        dependency.doSomething();
        dependency.doSomething();
    }

    public void singleCallWithParameter(Dependency dependency) {
        dependency.acceptParameter("Hello world");
    }

    public void chainingCalls(Dependency dependency) {
        String result = dependency.doSomething();
        dependency.acceptParameter(result);
    }
}
LearningMockitoTest.java
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class LearningMockitoTest {
    private Dependency dependency;
    private LearningMockito classBeingTested;

    @BeforeEach
    public void setUp() {
        classBeingTested = new LearningMockito();

        // Ajoutez vos mocks ici;
    }
}

Tester avec Mockito

Ajouter le code manquant dans les exercices suivants, sans regarder les solutions! Bonne chance!

1. Instancier les Mocks

@BeforeEach
public void setUp() {
    classBeingTested = new LearningMockito();

    // Ajoutez vos mocks ici;
}
@BeforeEach
public void setUp() {
    classBeingTested = new LearningMockito();

    dependency = mock(Dependency.class);
}

2. Vérifier une fois

@Test
public void verifyingWhenACallHappensOnce() {
    classBeingTested.singleCall(dependency);

    // Then ??
}
@Test
public void verifyingWhenACallHappensOnce() {
    classBeingTested.singleCall(dependency);

    verify(dependency).doSomething();
}

3. Verifier deux fois

@Test
public void verifyingWhenACallHappensTwice() {
    classBeingTested.twoCalls(dependency);

    // Then ??
}
@Test
public void verifyingWhenACallHappensTwice() {
    classBeingTested.twoCalls(dependency);

    verify(dependency, times(2)).doSomething();
}

4. Verifier avec un paramètre

@Test
public void verifyingWhenAMethodIsCalledWithAParameter() {
    classBeingTested.singleCallWithParameter(dependency);

    // Then ??
}
@Test
public void verifyingWhenAMethodIsCalledWithAParameter() {
    classBeingTested.singleCallWithParameter(dependency);

    verify(dependency).acceptParameter("Hello world");
}

5. Surcharger le comportement et vérifier une valeur

@Test
public void settingUpTheMockToReturnAValue() {
    // Given ??

    classBeingTested.chainingCalls(dependency);

    // Then ??
}
@Test
public void settingUpTheMockToReturnAValue() {
    String result = "Some result";
    willReturn(result).given(dependency).doSomething();

    classBeingTested.chainingCalls(dependency);

    verify(dependency).acceptParameter(result);
}

6. Vérifer que le refus n'est jamais appelé

Note: ici on ne vous demande pas de décider si on voudrait vraiment tester cela...

@Test
public void verifyingWhenSingleCallNeverCallRefuse() {
    classBeingTested.singleCallWithParameter(dependency);

    // Then ?? (refuseParameter n'est jamais appelé)
}

@Test
public void verifyingWhenAMethodIsCalledWithAnyParameter() {
    classBeingTested.singleCallWithParameter(dependency);

    verify(dependency, never()).refuseParameter(anyString());
}

⚠️ S'assurer d'avoir utilisé anyString car sinon cela revient à vérifier que ça n'a jamais été appelé avec uniquement ce paramètre...