web-dev-qa-db-fra.com

Maquette de classe en classe sous test

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. 

14
NikedLab

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.

14
cyon

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());
3
mthmulders

Vous pouvez définir quoi retourner dans Mockito.

when(mock.method()).thenReturn(someValue)
0
mokuril