Comment puis-je me moquer avec Mockito des autres classes de ma classe qui est en cours de test?
Par exemple:
MyClass.Java
class MyClass {
public boolean performAnything() {
AnythingPerformerClass clazz = new AnythingPerformerClass();
return clazz.doSomething();
}
}
AnythingPerformerClass.Java
class AnythingPerformerClass {
public boolean doSomething() {
//very very complex logic
return result;
}
}
Et testez:
@Test
public void testPerformAnything() throws Exception {
MyClass clazz = new MyClass();
Assert.assertTrue(clazz.performAnything());
}
Puis-je usurper AnythingPerformerClass
pour exclure la logique inutile de AnythingPerformerClass
? Puis-je remplacer la méthode doSomething()
pour un retour simple true
ou false
?
Pourquoi je spécifie Mockito, parce que j'en ai besoin pour tester Android avec Robolectric.
Vous pouvez refactoriser MyClass
pour qu’il utilise injection de dépendance . Au lieu de le créer une instance AnythingPerformerClass
, vous pouvez transmettre une instance de la classe au constructeur de MyClass
comme suit:
class MyClass {
private final AnythingPerformerClass clazz;
MyClass(AnythingPerformerClass clazz) {
this.clazz = clazz;
}
public boolean performAnything() {
return clazz.doSomething();
}
}
Vous pouvez ensuite passer à la mise en œuvre fictive dans le test unitaire
@Test
public void testPerformAnything() throws Exception {
AnythingPerformerClass mockedPerformer = Mockito.mock(AnythingPerformerClass.class);
MyClass clazz = new MyClass(mockedPerformer);
...
}
Sinon, si votre AnythingPerformerClass
contient un état, vous pouvez alors passer un AnythingPerformerClassBuilder
au constructeur.
Dans l'état actuel des choses (déclaration et instanciation de AnythingPerformerClass
dans une méthode, il n'est pas possible de se moquer de AnythingPerformerClass
en utilisant uniquement Mockito.
Si possible, déplacez la déclaration et l'instanciation de AnythingPerformerClass
au niveau de la classe: déclarez une variable d'instance de type AnythingPerformerClass
et faites-la instancier par le constructeur.
De cette façon, vous pourriez plus facilement injecter une maquette de AnythingPerformerClass
pendant le test et spécifier son comportement. Par exemple:
when(anythingPerformerClassMock.doSomething()).thenReturn(true);
ou pour tester la gestion des erreurs:
when(anythingPerformerClassMock.doSomething()).thenTrow(new NullPointerException());
Vous pouvez définir quoi retourner dans Mockito.
when(mock.method()).thenReturn(someValue)