2011-11-22 10 views
19

I mają tę Mockito:Mockito thenReturn powraca sam przykład

when(mockedMergeContext.createNewEntityOfType(IService.class)).thenReturn(new ServiceMock()); 

Sposób createNewEntityOfType należy zawsze zwracać nową ServiceMock wystąpienie ale zwraca dwukrotnie tego samego odniesienia.

Dlaczego metoda thenReturn nie zwraca nowego ServiceMock?

+1

Spróbuj stubbing z [zwrotnej] (http: //docs.mockito.googlecode .com/hg/latest/org/mockito/Mockito.html # 11) – McDowell

+0

Dzięki! To działa – myborobudur

Odpowiedz

35

Metoda zawsze zwróci to, co jest do niej przekazywane. Kod new Servicemock() jest wykonywany przed wywołaniem pod numerem thenReturn. Utworzony ServiceMock jest następnie przekazywany do thenReturn. Dlatego thenReturn ma bezwzględne wystąpienie ServiceMock, a nie mechanizm tworzenia.

Jeśli trzeba dostarczyć nową instancję, użyj thenAnswer

when(mockedMergeContext.createNewEntityOfType(IService.class)) 
    .thenAnswer(new Answer<IService>() { 
    public IService answer(InvocationOnMock invocation) { 
     return new ServiceMock(); 
    } 
    }); 
+0

Wielkie dzięki za uratowanie mojego dnia :) –

10

Możesz chcieć byłaby to na różne sprawozdania, aby zrozumieć, dlaczego tak się dzieje.

Service svc = new ServiceMock(); 
when(mockedMergeContext.createNewEntityOfType(IService.class)).thenReturn(svc); 

Czy widzisz teraz, dlaczego to nie działa? :)

To zawsze zwraca zatrzymanie instancji w svc, nie będzie ponownej oceny new ServiceMock() za każdym razem, gdy metoda zostanie wywołana.

+1

Masz rację! Dzięki! – myborobudur

3

W Javie 8 z lambdas można po prostu użyć

when(mockedMergeContext.createNewEntityOfType(IService.class)).thenAnswer(invocation -> new ServiceMock()); 

Więc po prostu zastąpić .thenReturn(new MyMock());

z .thenAnswer(invocation -> new MyMock());

Powiązane problemy