2012-04-10 6 views
1

Ich habe die folgende Klasse:Überprüfen der Sequenz der privaten Methode ruft in Unit-Tests

class MyClass { 

    public void doIt() { 
    methodOne(); 
    methodTwo(); 
    methodThree(); 
    } 

    private void methodOne() { 
    // ... 
    } 

    // rest of methods similar... 

} 

Meine Absicht zu überprüfen ist, dass, wenn ich rufe doIt(), Methoden metodOne(), methodTwo() und methodThree() wird in dieser Reihenfolge aufgerufen.

Ich benutze mockito für Spott. Weiß jemand, wie ich dieses Szenario testen kann?

Antwort

9

Hasse es, die Person zu sein, aber: einfach nicht testen. Testen Sie die Ausgabe, Nebenwirkungen, Ergebnisse - nicht die Implementierung.

Wenn Sie wirklich die richtige Reihenfolge sicherstellen möchten, extrahieren Sie diese Methoden in separate Klasse (n) und verspotten Sie sie.

+0

Die Stimme der Vernunft hat gesprochen. Großer erster Absatz. Wenn Sie sich während des Tests auf die Ergebnisse konzentrieren, erzielen Sie weitaus bessere Ergebnisse, als wenn Sie sich auf die Implementierung konzentrieren. –

+0

In diesem speziellen Fall möchte ich den Zustand eigentlich nicht testen. Ich möchte das Verhalten meiner Methode testen (http://martinfowler.com/articles/mocksArentStubs.html) –

+0

@lefty Testing, dass diese Interaktionen passieren, wäre wirklich besser für Design und Wartbarkeit, wenn Sie sie in ein anderes Objekt, dass Sie kann spotten. – Brice

3

Solange Ihre privaten Methoden ... nun ... privat sind, testen Sie sie nicht. Sie sind Implementierungsdetails. Sie könnten refaktoriert werden, ohne den Vertrag Ihrer Klasse zu ändern. Testen Sie das korrekte Ergebnis Ihrer öffentlichen Methoden.

+0

Meine öffentliche Methode ist nur eine init() -Methode. Es gibt nichts zurück, es setzt nur den Klassenstatus. Was ich tun möchte, ist zu überprüfen, dass der initialisierte Zustand der richtige ist. Da ich mich jedoch von einer Klasse, die ich nicht besitze, erweitere, muss ich mehrere Methoden intern von init() ausführen, um das zu tun (sonst läuft es einfach nicht). –

+0

IMHO-Tests existieren, um Ihnen zu helfen, Code zu reformieren, indem Sie Ihnen das Vertrauen geben, dass alles noch funktioniert. Wenn Sie also sicherstellen wollen, dass die Initialisierung korrekt ist, überprüfen Sie sie. (Es ist möglicherweise nicht trivial auf Legacy-Code.) Ich denke, nichts wird gewonnen, indem man eine bestimmte Art und Weise, dies zu tun, anstatt das Ergebnis zu überprüfen. – DerMike

Verwandte Themen