2016-11-03 3 views
-1

Ich verwende Mockito, um einige Tests in meinem Java-Code zu schreiben. In meinem Test habe ich ein reales Objekt, aber ich möchte spotten, was in einer der Methoden passiert, und auf die Methodenargumente zugreifen können.Wie würde ich eine Methode eines realen Objekts verspotten und auf die Argumente der Methode zugreifen?

Wenn ich dies tun:

MyObj spyObj = spy(new MyObj()); 
doReturn(false).when(spyObj).myMethod(anyObject(), anyObject(), anyList(), anyLong()); 

Ich kann die Argumente zugreifen und mit ihnen jede Art von Logik zu tun.

Wenn ich jedoch Mockito.when() verwenden wie so:

when(spyObj.myMethod(anyObject(), anyObject(), anyList(), anyLong())).thenAnswer(invocation -> { 
    if (invocation.getArguments()[0] == 1) { 
     // do stuff 
     return true; 
    } 
    return false; 
}); 

das eigentliche Verfahren läuft anstelle der verspottet Methode. Wie könnte ich meinen Test ausführen lassen, meine verspottete Methode und in der Lage sein, auf die Argumente innerhalb der verspotteten Methode zuzugreifen? Vielen Dank!

+0

Nicht mit Mocikto ausgiebig, aber vielleicht kann dies helfen: http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#13 und einige Sachen hier: http: //www.vogella .com/tutorials/Mockito/article.html # mockito_spy –

+1

Verwenden Sie doAnswer() .when(), genauso wie Sie doReturn() .when() verwenden. Siehe http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html#12. –

Antwort

1

Die Syntax Sie wollen, ist

doAnswer(invocation -> { whatever }).when(spyObj).myMethod(whatever); 

Auf diese Weise können Sie eine Methode eines Spions Stummel, ohne es tatsächlich aufgerufen wird.

+0

Großartig, das funktioniert, danke! –

1

Vielleicht brauchen Sie keine Spott. Erweitern und überschreiben. wenn

Zum Beispiel haben Sie eine Klasse wie folgt:

class Person { 
    String login(String username, String password) { 
     return LoginManager.login(username, password); 
    } 
} 

Beachten Sie den statischen Aufruf LoginManager.login, die nicht leicht injiziert werden kann. Sie können eine anonyme Unterklasse von Person und überschreiben die login Methode erstellen und tun in das, was Sie brauchen:

@Test 
public void test_something() { 
    Person person = new Person() { 
     @Override 
     String login(String username, String password) { 
      return "whatever"; 
     } 
    }; 
} 

diese Weise können Sie die volle Kontrolle über die überschriebene Methode haben, und dem Rest des Verhaltens Die Klasse ist unverändert.

+0

Das war mein Gedanke auch. Das Problem ist mit unveränderlichen und endgültigen Klassen, die nicht erweitert werden können –

+0

Das ist auch eine gute Idee, danke! –

Verwandte Themen