2016-06-08 20 views
1

Ich habe eine Methode genannt, die wie dieser (Vereinfachung) siehtStellen Sie sicher, ein void-Methode wurde in einer privaten Methode mit EasyMock/PowerMock

private boolean x = someMethodToSetTheValueOfX(); 

private void method(args){ 
     if(x){ 
      method1(); 
     }else{ 
      method2(); 
     } 
} 

ich einen Komponententest schreiben möchten zu garantieren, dass, wenn x wahr ist, method1 wird aufgerufen. Ich weiß, dass ich die Whitebox von PowerMock verwenden kann, um den Wert von x festzulegen und die Methode aufzurufen, aber wie kann ich bestätigen, dass method1() aufgerufen wurde? Beachten Sie, dass method1() ungültig ist.

Ich darf neben EasyMock/PowerMock kein anderes Framework (wie Mockito) verwenden.

+0

Nur für den Fall innerhalb method1 setzen : lassen Sie es mich wissen, wenn Sie weitere Informationen benötigen, um meine Antwort hilfreich zu finden; ansonsten bitte nicht vergessen, Antworten zu akzeptieren ;-) – GhostCat

Antwort

1

Sie bekommen das falsch; So sollten Sie Ihre Tests nicht gestalten.

Zunächst einmal: Bitte verwenden Sie keines der PowerMock ... Frameworks. Sie beruhen auf der Byte-Code-Manipulation; und das erfordert früher oder später Ärger. Glauben Sie mir, ich habe viele Stunden damit verbracht, wirklich seltsame Fehler ohne gute Gründe zu jagen.

Dann: teste deinen Code nicht auf diese Weise!

Sie verwenden ein spöttisches Framework zum Erstellen/Steuern der Objekte, die Sie an Ihre "getestete Klasse" übergeben. Sie verwenden das Framework nicht, um Ihre "Testklasse" direkt zu testen! Genauer gesagt: Sie möchten keinen Testcode schreiben, der private Methoden kennt - das sind Implementierungsdetails.

Was Sie tun statt:

a) wie gesagt, können Sie verspotten verwenden, um Objekte in der Klasse unter Test bestehen. Und dann können Sie kontrollieren, ob diese Mocks die Aufrufe sehen, die Sie von Ihrer "Klasse unter Test" erwarten. Im schlimmsten Fall könnten Sie also method1/2 auf ein anderes Objekt anwenden; und dann können Sie mit mock/verify prüfen, ob sie wie erwartet aufgerufen wurden.

b) Sie erstellen Objekte Ihrer "Klasse im Test" ... und dann "geltend machen" auf die Eigenschaften dieser Objekte; oder auf Ergebnisse, die Methodenaufrufe zurückgeben.

+0

Auch nicht das mit PowerMock ändern Sie das Gerät im Test. Sie testen also nicht Ihre Testklasse, sondern etwas, das in der Produktion nicht zu sehen ist. – SpaceTrucker

1

können Sie entweder:

System.out.println("method one was called"); 

Wenn Sie zu einem consol in einer IDE wie Eclipse drucken können, oder -nutzung:

JOptionPane.showMessageDialogue(null, "method one was called"); 

Und sie

+0

Ich denke, du hast die Frage falsch verstanden. Es geht um Komponententests (wie JUnit-Tests). Nicht zur Fehlerbehebung. Aber ansonsten ja, ich würde das erste machen :) – Steve