2015-12-16 3 views
10

Betrachten Sie die folgende Methode:Wie man Methodenaufruf vortäuschen und Wert zurückgeben, ohne die Methode zu laufen?

public boolean isACertainValue() { 
     if(context.getValueA() != null && context.getValueA().toBoolean() == true) { 
     if(context.getType() != null && context.getType() == ContextType.certainType) { 
      return true; 
     } 
    } 
    return false; 
} 

ich diesen Code nicht geschrieben hat, ist es wie die Hölle hässlich ist, ist es total kompliziert, aber ich habe mit ihm zu arbeiten.

Jetzt möchte ich eine Methode testen, die auf einen Aufruf dieser Methode angewiesen ist.

Ich dachte, ich mit diesem durch umgehen konnte:

Mockito.when(spy.isACertainValue()).thenReturn(true); denn das ist der Fall, dass ich testen möchten ist.

Aber es funktioniert nicht, da es immer noch die Methode Körper-Aufruf ist:/

ich nullpointers bekommen oder besser gesagt bekomme ich etwas entlang der Linien von

misusing.WrongTypeOfReturnValue; Boolean kann nicht von getValueA() zurückgegeben werden. getValueA() sollte ValueA zurückkehren

Also versuchte ich (als Behelfslösung) zu tun:

Mockito.when(contextMock.getValueA()).thenReturn(new ValueA()); und Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType);

aber dann bekomme ich eine Nullpointer, die ich scheinen kann nicht der Lage zu sein, debuggen.

Also, wie wird es in diesem Fall gemacht?

+1

das ist genau, wie es zu tun, aber vielleicht gibt es einen Wert in diesem WertA Sie weiter in Ihrem Test benötigen, so sollten Sie das Objekt zurück auch verspotten, nicht nur Rückkehr eine Instanz, die mit einem (Standard) -Konstruktor instanziiert wird. – Stultuske

Antwort

13

Wenn Sie

Mockito.when(spy.isCertainValue()).thenReturn(true); 

die Methode isCertainValue() genannt Aufruf hier wird immer. So funktioniert Java: Um das Argument Mockito.when auszuwerten, muss das Ergebnis spy.isCertainValue() ausgewertet werden, damit die Methode aufgerufen werden muss.

Wenn Sie nicht wollen, dass das geschehen kann, können Sie the following construct verwenden:

Mockito.doReturn(true).when(spy).isCertainValue(); 

Dies wird die gleiche spöttischen Wirkung haben, aber die Methode nicht mit diesem aufgerufen werden.

+0

Danke, ich bin jetzt mehr auf dem richtigen Weg ... Ich bekomme einen Nullpointer tho xD Ich hasse dieses Programm so sehr, es ist ein Gräuel: X – Sorona

+0

Broken link. Wo gründest du Spionage? – powder366

+0

Es funktionierte für mich. Es hörte auf, NPE zu werfen. Danke Tunaki! – Dish

0

Dieser Code ist korrekt:

Mockito.when(contextMock.getType()).thenReturn(ContextType.certainType); 

Aber Sie bekommen Nullpointer, weil Sie nicht den Mocking Wert definiert haben, die definiert sein sollte, auch ich bin mit Spring, Datei in meinem Zusammenhang, wenn ich @Autowired definieren Bohne definiere ich es so:

<bean id="contextMock" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.example.myspringproject.bean.ContextMock" /> 
</bean> 
Verwandte Themen