2015-10-14 1 views
6

Ich habe eine Klasse A mit 2 Funktionen: Funktion a(), die eine Zufallszahl zurückgibt. Funktion b() die a() aufruft und den zurückgegebenen Wert zurückgibt.Mockito wenn(). DannReturn() nicht richtig funktioniert

In einem Test habe ich dies:

A test = Mockito.mock(A.class) 
Mockito.when(test.a()).thenReturn(35) 
assertEquals(35,test.a()) 
assertEquals(35,test.b()) 

Der Test am zweiten Assertion fehlschlägt. Weiß jemand warum?

Um klar zu sein - das ist nicht mein richtiger Code, sondern ein einfacher Code mein Problem

Antwort

16

Da Klasse A verspottet wird, gehen alle Methodenaufrufe nicht zum tatsächlichen Objekt. Das ist der Grund, warum Ihre zweite Assert fehlschlägt (ich denke, es könnte 0 zurückgegeben haben).

Lösung:

Sie tun könnte so etwas wie

when(test.b()).thenCallRealMethod(); 

sonst könnte man spy wie

A test = spy(new A()); 
Mockito.when(test.a()).thenReturn(35); 
assertEquals(35,test.a()); 
assertEquals(35,test.b()); 
+1

@SajanChandran Danke !! Beide Lösungen funktionieren!2 Fragen: 1) Für die erste Lösung muss ich dann CallRealMethod() für jede Funktion in der Klasse tun? für jede Funktion mit einem Aufruf an a()? 2) Was ist bei der zweiten Lösung der Unterschied zwischen "Spion" und "Spionage"? – tamird14

+1

Ja, wenn Sie eine echte Methode verwenden möchten, müssen Sie 'thenCallRealMethod' aufrufen und diese für http://stackoverflow.com/questions/28295625/mockito-spy-vs-mock sehen –

+0

Es liegt an Ihnen, im Grunde zu entscheiden, eine echte Methode zu verspotten oder aufzurufen –

3

Funktion b(), welche Anrufe ein()

Vielleicht liegt es in Ihrer aktuellen tut zu erklären Beton A, aber das wird in diesem Fall nicht verwendet. Nur der Schein wird hier benutzt.

So müssen Sie die Mock sagen, was für jede Methode, die Sie anrufen möchten, tun:

Mockito.when(test.b()).thenReturn(35); 
3

Da Sie nur ein Mock haben, wenn Sie es mit test.a() aufrufen. Sie müssen Mockito.when(test.b()).thenReturn(35) hinzufügen. dann funktioniert Ihr Code gut

+0

Also wenn ich eine Funktion, die ein() und etwas tut, mit dem zurück ruft Wert, und ich möchte es testen? a() gibt eine Zufallszahl zurück und für den Test möchte ich eine feste Zahl zurückgeben, die ich entscheide. Wie mache ich es? – tamird14

+0

@ tamird14 kann nicht bekommen – Jens

+0

lässt sagen, ich habe eine Funktion b(), die a() aufruft, die zurückgegebene Zahl und gibt die umgekehrte Zahl zurück (123 und 321 zum Beispiel). Ich möchte diese Funktion testen. Das Problem ist, dass ich nicht weiß, was a() zurückgibt, weil es zufällig ist. Also möchte ich a() die Zahl 123 (zum Beispiel) zurückgeben, damit ich in den Test assertEquals schreiben konnte (321, A.b()). Ich möchte die Funktion testen, wenn ich weiß, was ein() in diesem speziellen Fall gibt – tamird14