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...