2016-07-01 15 views
0

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.

+0

Sie rufen 'methodUsingThePrivateMethod()' auf dem Mock-Objekt, welches wiederum 'methodIWantToMock ("some string")' intern telefonieren. Welches Verhalten hast du hier erwartet? –

+0

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

+0

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

Antwort

1

Also habe ich eine Lösung gefunden, die für mich funktioniert. Anstatt einen spy zu verwenden, benutzte ich einen mock und sagte dann zu PowerMockito, die reale Methode zu nennen, wenn methodUsingThePrivateMethod() innerhalb meines verspotteten Gegenstandes genannt wurde. Es ist im Wesentlichen das Gleiche wie zuvor, aber nur mit einem mock anstelle von spy. Auf diese Weise ruft PowerMockito NICHT die private Methode auf, deren Verhalten ich unter Verwendung von PowerMockito.doReturn(...).when(...) zu steuern versuche. Hier ist mein modifizierter Testcode. Die Linien I geändert/hinzugefügt werden, markiert:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(ClassOfInterest.class) 
public class ClassOfInterestTest { 

    @Test 
    public void someTestMethod() { 

    //Line changed: 
    ClassOfInterest coiMock = PowerMockito.mock(new ClassOfInterest()); 

    //Line changed: 
    PowerMockito.doReturn(null).when(coiMock, "methodIWantToMock", any(String.class)); 

    //Line added: 
    PowerMockito.when(coiMock.methodUsingThePrivateMethod()).thenCallRealMethod(); 

    coiSpy.methodUsingThePrivateMethod(); 

    //Do some stuff ... 

    } 
} 
Verwandte Themen