2014-12-11 2 views
19

Ich habe eine ziemlich komplexe Java-Funktion, die ich mit jUnit testen möchte und verwende Mockito für diesen Zweck. Diese Funktion sieht wie folgt aus:Eingabeparameter einer void-Funktion ändern und danach lesen

public void myFunction (Object parameter){ 
    ... 
    doStuff(); 
    ... 
    convert(input,output); 
    ... 
    parameter.setInformationFrom(output); 
} 

Die Funktion convert setzt die Attribute der Ausgang auf Eingang abhängig und es ist eine Hohlraumtyp-Funktion, obwohl die „Ausgabe“ Parameter ist, was verwendet wird, als ob es durch die zurückgegeben wurden Funktion. Diese Konvertierungsfunktion ist das, was ich nachbilden möchte, da ich mich nicht auf die Eingabe für den Test verlassen muss, aber ich weiß nicht, wie ich das machen soll, da ich mit Mockito nicht sehr vertraut bin.

Ich habe als when(something).thenReturn(somethingElse) oder doAnswer Methode grundlegende Fälle gesehen, die ich verstehe mit der vorherige, aber mehr Logik ähnelt kann hinzugefügt werden, aber ich glaube nicht, diese Fälle für meinen Fall angemessen sind, als mein Funktion hat keine Rückgabeanweisung.

+0

Und was wollen Sie bis verspotten? Die Ausgabe? – fge

+1

Mockito beiseite, wissen Sie, dass das Schreiben von 'parameter = output;' nicht den Wert der Variablen ändert, die Sie an diese Methode übergeben? –

+0

@David Wallace, wenn der Parameter "a" ist, ich die reale Funktion myFunction und den I-Print-Parameter aufrufen, dann wird der Parameter zum Beispiel "ab" sein. Es ist nicht genau "parameter = output", ich habe das nur geschrieben, um den Code zu verstehen. Entschuldigung für die Verwirrung. – Juan

Antwort

35

Wenn Sie möchten, dass die verspottete Methode eine Methode aufruft (oder anderweitig ändert), müssen Sie eine Antwort wie in dieser Frage schreiben ("How to mock a void return method affecting an object").

Von Kevin Welker ‚s answer dort:

doAnswer(new Answer() { 
    Object answer(InvocationOnMock invocation) { 
     Object[] args = invocation.getArguments(); 
     ((MyClass)args[0]).myClassSetMyField(NEW_VALUE); 
     return null; // void method, so return null 
    } 
}).when(mock).someMethod(); 
+0

Das ist was ich will, danke! – deFreitas

+1

Sie können die neue Answer() -Anweisung vom Typ Void ändern und auch den Rückgabetyp von answer() in Void ändern, um eine Warnung für den Konstruktor zu vermeiden. – Moz

+0

Konkret sieht das so aus: neue Antwort () { .... Rückkehr (Null); } – hubatish

Verwandte Themen