PowerMock EasyMock Grundlagen
Dies ist wahrscheinlich eine PowerMock/EasyMock 101 Frage welche kann ich nicht herausfinden, warum.
Ich habe eine C-Klasse mit Methoden
public static boolean testInner(String s) {
return false;
}
public static boolean testOuter() {
String x = "someValue";
return testInner(x);
}
In meinem test testOuter () - Methode möchte ich sicherstellen testInner genannt wird, mit entsprechenden parameter. So zu tun, ich Tue so etwas wie dieses: [@RunWith(PowerMockRunner.class)
@PrepareForTest(EmailUtil.class), erklärte auf Klassen-Ebene]
EasyMock.expect(C.testInner("blabla")).andReturn(true);
PowerMock.replayAll();
boolean status = C.testOuter();
PowerMock.verifyAll();
assertTrue(status);
Aber ich bin immer Fehler wie:
java.lang.AssertionError:
Unexpected method call testOuter():
testInner("blabla"): expected: 1, actual: 0
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:45)
at org.powermock.api.easymock.internal.invocationcontrol.EasyMockMethodInvocationControl.invoke(EasyMockMethodInvocationControl.java:95)
at org.powermock.core.MockGateway.doMethodCall(MockGateway.java:105)
at org.powermock.core.MockGateway.methodCall(MockGateway.java:60)
at C.testOuter(C.java)
Ersetzte ich die tatsächlichen parameter mit EasyMock.IsA(String.class), aber noch kein Glück. Ich bin mir ziemlich sicher, ich mache etwas grundsätzlich albern hier.
Keine Hilfe?
InformationsquelleAutor phewataal | 2012-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, es gibt hier zwei Probleme, das eine hat zu tun mit einem fehlenden nennen, die in den test-code. Die zweite hat zu tun mit dem Verständnis des Verhaltens, zu verhöhnen und den Unterschied zwischen der vollständigen und der teilweisen spöttisch.
Fehlende Anrufe
Scheinen Sie zu fehlen, ein Aufruf
PowerMock.mockStatic
oder einer derPowerMock.mockPartialMock
Methoden (siehe auch diese). Die erste Methode wird mock alle statischen Methoden übergeben werden, während das zweite mock nur die Liste der Methoden ist, gegeben.Ein Beispiel
Hier ist ein vollständiges Beispiel mit zwei test-Methoden, zeigen die beiden Optionen. Zuerst, haben wir mit dem test-Klasse mit diesen zwei Anmerkungen:
Die erste Anmerkung sagt JUnit ausführen der Tests, mit PowerMockRunner. Die zweite Anmerkung sagt, PowerMock, um vorzubereiten, zu verspotten die Klasse Dummy.
Vollständige Statische Mock
Als Nächstes sehen wir uns das Beispiel an, in dem alle statischen Methoden aus der Klasse
Dummy
werden verspottet. Was bedeutet das? Es bedeutet im wesentlichen, dass wir ersetzen möchten, die tatsächliche Umsetzung mit gefälschten (verspottet). Wie soll das fake-Implementierung Verhalten? Dies ist, was wir geben Sie in Erwartung.So, in der
testStaticMock
Methode, die wir erzählen EasyMock, um uns ein fake die Implementierung der beiden Methoden. Wir werden wie die gefälschteDummy.testOuter
einfach zurücktrue
. Und wir werden wie die fake-Dummy.testInner zurücktrue
wenn Sie übergeben das argument"bb"
. Beachten Sie, dass, wenn diese spottet aktiviert sind (PowerMock.replayAll
), den test-code nur ausgeführt wird, der fake-Methoden und nicht auf die tatsächliche Realisierung-dies scheint die Quelle deiner Verwirrung ist. Ich habe mehr zu sagen, auf später.Teilweise Statische Mock
Hier ist ein weiterer test, wo wir verspotten Sie nicht alle Methoden, dass nur diejenigen, die wir übergeben
mockStaticPartial
. Unten, wir sagen PowerMock, dass wir nur wollen, zu verspotten, die MethodeDummy.testInner
. So, ein Teil vonDummy
verspottet wird und der rest der Klasse unter test.Lassen und die verspottet Klasse
Dummy
werden wie folgt definiert:Voller Spott vs Teilweise Spöttische
Einer Sache zu verstehen, über die volle statische Spott ist, dass alle statischen Methoden verspottet. So, die Methode
testOuter
wird ersetzt durch eine ironisierte version wird über eine Implementierung wie die folgende:Also, wir sollten nicht erwarten, dass die verspottet version zum aufrufen von Methoden, die die tatsächliche Umsetzung bedeutet. Wir wollten nicht, um sich über die Interna der Methode. Dies war der Grund, warum wir beschlossen, zu verhöhnen, als es sowieso-zu ersetzen, seine Interna mit einem Spielzeug Umsetzung, nur definiert durch die Erwartung, die wir setzen.
Einer der anderen Seite, wenn wir nicht teilweise lustig, wir hatten nicht verspotten
testOuter
, wir waren also das aufrufen der eigentlichen Implementierung.InformationsquelleAutor rrufai
Du bist nur sagen, EasyMock zu erwarten, dass ein Aufruf testInner(), nicht testOuter().
So probiert:
Hmm, anscheinend zu lange, da ich früher EasyMock 🙂 Vielleicht war es so....EasyMock.erwarten(C. testOuter()).andReturn(true);
InformationsquelleAutor Peter Liljenberg
Reagiert, um ein Beispiel call-flow zu simulieren Sie eine statische void-Funktion mit mockStaticPartial().
Später in den test, wenn Sie rufen Sie so etwas wie:
Den test aufrufen, die wahre Methode, da nur die test () - Funktion wurde verspottet in diesem Fall.
Haftungsausschluss: ich bin mir bewusst, dass dies möglicherweise nicht der BESTE Ort, um fügen Sie diese Antwort, aber zusammenstückeln ein paar andere Antworten zu verschiedenen Fragen hat mir geholfen, kommen mit dieser Antwort, fühlte es notwendig, legen Sie Sie irgendwo.
InformationsquelleAutor landesko