2015-10-14 24 views
6

Mam klasę A z 2 funkcjami: funkcja a(), która zwraca liczbę losową. funkcja b(), która wywołuje funkcję a() i zwraca zwróconą wartość.Mockito kiedy(). ThenReturn() nie działa poprawnie

W teście pisałem tak:

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

test nie powiedzie się na drugim assert. Czy ktoś wie, dlaczego?

Żeby było jasne - to nie jest mój prawdziwy kod, ale prosty kod wyjaśnić mój problem

Odpowiedz

16

Ponieważ wyśmiewa się klasę A, wszystkie wywołania metod nie będą wykonywane w rzeczywistym obiekcie. To dlatego twoja druga próba kończy się niepowodzeniem (myślę, że mogła wrócić 0).

Rozwiązanie:

Można zrobić coś

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

jeszcze można spy jak

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

@SajanChandran Dziękujemy! Oba rozwiązania działają!2 pytania: 1) Dla pierwszego rozwiązania, będę musiał zrobić toCallRealMethod() dla każdej funkcji w klasie? dla każdej funkcji z wywołaniem do()? 2) W przypadku drugiego rozwiązania, jaka jest różnica między "mockiem" a "szpiegiem"? – tamird14

+1

tak, jeśli chcesz użyć jakiejkolwiek prawdziwej metody, musisz zadzwonić do 'thenCallRealMethod' i zobaczyć to na http://stackoverflow.com/questions/28295625/mockito-spy-vs-mock –

+0

To zależy od Ciebie, aby zdecydować w zasadzie, wyśmiać lub wywołać prawdziwą metodę –

3

funkcji B(), która nazywa()

Może to robi w rzeczywisty beton A, ale to nie jest używane w tym przypadku. Używa się tu tylko mocku.

Więc trzeba powiedzieć, makiety, co zrobić dla każdej metody chcesz zadzwonić:

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

Ponieważ masz tylko makiety, gdy nazywają go z test.a().

Należy dodać Mockito.when(test.b()).thenReturn(35). wtedy twój kod działa dobrze

+0

Więc jeśli mam funkcji, które wywołuje() i robi coś z zwrócony wartość i chcę to przetestować? a() zwraca liczbę losową, a dla testu chcę, żeby zwróciła ustaloną liczbę, którą zdecyduję. Jak mam to zrobić? – tamird14

+0

@ tamird14 nie może ci dać – Jens

+0

Powiedzmy, że mam funkcję b(), która wywołuje a(), weź zwracaną liczbę i zwróć numer odwrotny (na przykład 123 i 321). Chcę przetestować tę funkcję. Problem polega na tym, że nie wiem, co a() zwróci, ponieważ jest losowe. Tak więc chcę, aby() zwróciło liczbę 123 (na przykład), abym mógł napisać w teście assertEquals (321, A.b()). Chcę przetestować funkcję, gdy wiem, co to() zwraca w tym konkretnym przypadku – tamird14

Powiązane problemy