2017-09-06 5 views
1

Ci-dessous ma conception de code. J'ai besoin de conseils, comment écrire le cas de test pour cela.Se moquer des objets des méthodes protégées en Java

abstract class X 
{ 
    public void xyz() 
    { 
     A a = getA(); 
     callMe(a); 
    } 
    private A getA() 
    { 
      //do some stuff 
      return a; 
    } 
    protected void callMe(); 
} 

est inférieure à la classe enfant:

class Y extends X 
{ 
    @Autowired 
    MyClass myClass; 

    protected void callMe(A a) 
    { 
     B b = provideB(); 
     C c = b.getC(); 
     c.setValue(myClass.getSomeValue()); 
    } 
    private B provideB() 
    { 
     //every child class has its own way of providing this object 
     return b; 
    }  
} 

Maintenant, j'écritoires de tests unitaires pour la classe de l'enfant Y, je fais appel méthode xyz pour les tests. Je sais que je dois me moquer de l'objet MyClass car c'est ma dépendance externe. Alors je me suis moqué de ça. Mais je suis confus que dois-je me moquer A et donc par la suite B et C aussi bien ou comme ils sont créés d'une manière ou d'une autre dans des méthodes protégées/privées, alors devrais-je laisser sa création se produire pendant les tests? Toute avance sera appréciée.

Répondre

1

Personnellement, je ne fais que tester l'interface publique d'une classe. Donc, je n'appellerais que xyz() et vérifier que cela respecte son contrat. Puisque A, B et C ne sont pas injectés, ils ne font pas partie de l'interface publique et je ne me moquerais pas d'eux.

Maintenant si vous devez les injecter ou non. Cela dépend du type d'objets A, B et C. Si ce sont de petits objets stupides (des objets de valeur par exemple), vous pourrez les créer dans des méthodes privées/protégées. Si ce sont des objets un peu plus gros, et surtout si vous pourriez un jour en utiliser une implémentation différente, alors vous devriez les injecter et les railler. Si vous voulez que la classe X contrôle la durée de vie de ces objets, vous pouvez injecter une fabrique à la place et remplacer tous les appels par new par des appels à l'usine.