2017-09-06 3 views
1

Unten ist mein Code-Design. Ich brauche Anleitung, wie man den Testfall dafür schreibt.Mocking Objekte von geschützten Methoden in Java

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

unten ist das Kind Klasse:

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; 
    }  
} 

Nun, ich schreibe Einheit Testfälle für Kindklasse Y, also bin ich xyz Verfahren zum Testen aufrufen. Ich weiß, dass ich MyClass Objekt verspotten muss, da es meine externe Abhängigkeit ist. Also habe ich es verspottet. Aber ich bin verwirrt, dass sollte ich A und damit auch B und C nachahmen oder da sie irgendwie in geschützten/privaten Methoden erstellt werden, also, sollte ich ihre Erstellung während des Testens zulassen? Jede Leitung wird geschätzt.

Antwort

1

Persönlich teste ich nur die öffentliche Schnittstelle einer Klasse. Also würde ich nur xyz() anrufen und überprüfen, ob es seinen Vertrag respektiert. Da A, B und C nicht injiziert werden, sind sie nicht Teil der öffentlichen Schnittstelle und ich würde sie nicht verspotten.

Jetzt darüber, ob Sie sie injizieren sollten oder nicht. Es hängt davon ab, welche Art von Objekten A, B und C sind. Wenn es sich um kleine, dumme Objekte (zum Beispiel Wertobjekte) handelt, können Sie sie einfach in privaten/geschützten Methoden erstellen. Wenn sie etwas größere Objekte sind, und vor allem, wenn Sie vielleicht irgendwann eine andere Implementierung von ihnen verwenden möchten, dann sollten Sie sie injizieren und sie verspotten. Wenn Sie möchten, dass die X-Klasse die Lebensdauer dieser Objekte steuert, können Sie stattdessen eine Factory einspeisen und alle Aufrufe von new durch Aufrufe an die Factory ersetzen.