125 votes

Mockito Comment se moquer seulement de l'appel d'une méthode de la superclasse

J'utilise Mockito dans certains tests.

J'ai les cours suivants :

class BaseService {  
    public void save() {...}  
}

public Childservice extends BaseService {  
    public void save(){  
        //some code  
        super.save();
    }  
}   

Je veux me moquer seulement du deuxième appel (super.save) de ChildService. Le premier appel doit appeler la méthode réelle. Y a-t-il un moyen de le faire ?

104voto

jgonian Points 384

Si vous n'avez pas vraiment le choix pour la refactorisation, vous pouvez tout simuler dans l'appel de méthode super, par exemple

    class BaseService {

        public void validate(){
            fail(" I must not be called");
        }

        public void save(){
            //Save method of super will still be called.
            validate();
        }
    }

    class ChildService extends BaseService{

        public void load(){}

        public void save(){
            super.save();
            load();
        }
    }

    @Test
    public void testSave() {
        ChildService classToTest = Mockito.spy(new ChildService());

        // Prevent/stub logic in super.save()
        Mockito.doNothing().when((BaseService)classToTest).validate();

        // When
        classToTest.save();

        // Then
        verify(classToTest).load();
    }

6voto

Pensez à refactorer le code de la méthode ChildService.save () à une autre méthode et testez cette nouvelle méthode au lieu de tester ChildService.save(), de cette façon, vous éviterez les appels inutiles à la méthode super.

Exemple :

class BaseService {  
    public void save() {...}  
}

public Childservice extends BaseService {  
    public void save(){  
        newMethod();    
        super.save();
    }
    public void newMethod(){
       //some codes
    }
} 

2voto

Rubasace Points 679

Peut-être que l'option la plus facile si l'héritage a du sens est de créer une nouvelle méthode (paquet privé ? ?) pour appeler le super (appelons-le superFindall), espionner l'instance réelle et ensuite se moquer de la méthode superFindAll () de la façon dont vous vouliez vous moquer de la classe parent un. Ce n'est pas la solution parfaite en termes de couverture et de visibilité, mais elle devrait faire le travail et elle est facile à appliquer.

 public Childservice extends BaseService {
    public void save(){
        //some code
        superSave();
    }

    void superSave(){
        super.save();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X