Ich bin neu bei PowerMockito und es gibt ein Verhalten, das es anzeigt, das ich nicht verstehe. Der folgende Code erklärt mein Problem:PowerMockito ruft die Methode auf, wenn ich doReturn (..) verwende, wenn (....)
public class ClassOfInterest {
private Object methodIWantToMock(String x) {
String y = x.trim();
//Do some other stuff;
}
public void methodUsingThePrivateMethod() {
Object a = new Object();
Object b = methodIWantToMock("some string");
//Do some other stuff ...
}
}
ich eine Klasse, die eine private Methode enthält, die ich will methodIWantToMock(String x)
genannt verspotten. In meinem Test-Code, mache ich folgende:
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassOfInterest.class)
public class ClassOfInterestTest {
@Test
public void someTestMethod() {
ClassOfInterest coiSpy = PowerMockito.spy(new ClassOfInterest());
PowerMockito.doReturn(null).when(coiSpy, "methodIWantToMock", any(String.class));
coiSpy.methodUsingThePrivateMethod();
//Do some stuff ...
}
}
Gemäß dem obigen Code, PowerMockito sollte einfach zurückgeben null, wenn methodIWantToMock
innerhalb methodUsingThePrivateMethod()
aufgerufen wird, wenn ich den Test oben laufen. Was jedoch tatsächlich passiert ist, dass wenn dieser Befehl ausgeführt wird: PowerMockito.doReturn(...).when(...)
, PowerMockito ruft tatsächlich methodIWantToMock
dann und dort an !! Warum macht es das ?? An dieser Stelle wollte ich nur angeben, wie es die private Methode verspotten soll, sobald es schließlich genannt wird, wenn die coiSpy.methodUsingThePrivateMethod();
Linie ausgeführt wird.
Sie rufen 'methodUsingThePrivateMethod()' auf dem Mock-Objekt, welches wiederum 'methodIWantToMock ("some string")' intern telefonieren. Welches Verhalten hast du hier erwartet? –
Das ist richtig, aber durch das Debugging habe ich herausgefunden, dass PowerMockito 'methodIWantToMock()' aufruft, wenn ich den 'doReturn() .when()' Befehl ausführe. Es wartet nicht auf 'methodUsingThePrivateMethod()', um es aufzurufen. – Ahmad
Ich habe dieses Verhalten durch Debuggen gefunden. Wenn ich den Test (ohne Debugging) durchführe, stürzt der Test ab, weil 'NullPointerException' generiert wird, weil PowerMockito beim Ausführen des' doReturn (...). When (...) 'Befehls die private Methode ausführt, während' 'übergeben wird null 'als Eingabe, und wenn 'String y = x.trim();' in 'methodUsingThePrivateMethod()' ausgeführt wird, wird eine 'NullPointerException' generiert. Bottom line === der Befehl 'coiSpy.methodUsingThePrivateMethod();' wird nie umgesetzt. – Ahmad