2016-08-01 25 views
2

Ich habe ein Modell von KartenobjektWie spottet man someObj.meth1 (...). Meth2 (...)?

@Mock 
Map<String, Object> statusNode; 

ich dieses geschrieben habe, die Menge an Code

when(statusNode.get("ratePlanId")).thenReturn(
        when(mock(Number.class).longValue()).thenReturn(200L).getMock() 
    ); 

aber es throw Ausnahme zu reduzieren:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 

ich es tun kann auf andere Weise, aber es ist zu viel Code, und ich sollte exsessive Operation der Variableninitialisierung

verwenden
Number number = mock(Number.class); 
when(number.longValue()).thenReturn(100L); 
when(statusNode.get("subscriberStatusId")).thenReturn(number); 

Der allgemeine Fall ist: Wie kann man etwas ähnliches ohne die Operation der variablen Initialisierung vortäuschen?

someObj.get("standardId").longValue(); 

Antwort

3

Ihr Problem ist, dass die erste when bereits ausgeführt, wenn Sie die zweite Mock starten Anstoßen. In Mockito können Sie nur eine Methode auf einmal stubben. Was Sie tun könnten, ist, den inneren Schein einer lokalen Variablen wie dieser zuzuordnen.

Number innerMock = when(mock(Number.class).longValue()).thenReturn(200L).getMock(); 
when(statusNode.get("ratePlanId")).thenReturn(innerMock); 

Dies wird funktionieren. Aber das Meckern von Typen, die Sie nicht besitzen, ist ein bisschen ein Test-Anti-Pattern. Wenn Sie dies testen können, ohne die Number Klasse zu verspotten, wäre das besser.

when(statusNode.get("ratePlanId")).thenReturn(Long.valueOf(200L)); 
+0

In Mockito können Sie nur eine Methode gleichzeitig verarbeiten. Warum ist das Problem? –

+0

Es ist ein Problem wegen der Art, wie Mockito entworfen wurde. Wenn Sie 'when' aufrufen, schaltet es in eine Art" Stubbing-Modus "um, bei dem das Aufrufen einer Methode bei einem Mock es für Stubbing einrichtet. Sobald Sie sich im "Stubbing-Modus" befinden, lässt Mockito Sie nicht mehr "Wann" sagen, bis Sie mit dem Stubbing fertig sind. –

+0

Danke für wann (statusNode.get ("ratePlanId")). ThenReturn (Long.valueOf (200L)); Ich werde es benutzen und danke für die Erklärung. –

1

können Sie verwenden

Map<String, Object> statusNode = mock(Map.class, RETURNS_DEEP_STUBS); 

Und dann Mock Unteraufrufe:

when(statusNode.get("subscriberStatusId").longValue()).thenReturn(100L); 

Sie könnten Gießen benötigen:

when(((Number) statusNode.get("subscriberStatusId")).longValue()).thenReturn(100L); 
+0

Danke, ich kann es tun, aber ich brauche wann (statusNode.get ("name"). LongValue()). DannReturn (100L) get sind zurückgegeben Instanz der Objektklasse, die keine longValue() -Methode hat –

+0

Sie können Tun Sie das nicht, weil hashCode den primitiven Typ primitiv zurückgibt, während Sie nur Objekte überschreiben können. Es funktioniert nur für Methoden, die Objekt untergeordnete Objekte zurückgeben – maxpovver

+0

Für mein Fall funktioniert Ihr Beispiel nicht.Weil Karten speichern Objekte, die Zahlen in Echt. –

0

eine Antwort von einem anderen Blickwinkel Giving : erwägen, solchen Code zu vermeiden.

Ja, eine Menge Leute befürworten diese "fließenden" Schnittstellen, wo Sie foo.bar(). Whatever() eingeben.

Aber da ist eine schlechte Sache: Es ist eine Verletzung der Law of Demeter; und dadurch erhöht sich die Kopplung zwischen deinen Klassen!

Aber sicher, in Ihrem konkreten Beispiel, ist Ihnen wahrscheinlich egal, weil LongValue() auf ein Number-Objekt aufrufen ist keine große Sache.