2011-11-22 4 views
19

Tôi có điều này trong Mockito:Mockito thenReturn trả về cùng dụ

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

Phương pháp createNewEntityOfType nên luôn luôn trả về một ServiceMock dụ mới nhưng nó trả gấp đôi so với cùng tham khảo.

Tại sao phương thức thenReturn không trả lại ServiceMock mới?

+1

Hãy thử stubbing với một [callback] (http: //docs.mockito.googlecode .com/hg/mới nhất/org/mockito/Mockito.html # 11) – McDowell

+0

Cảm ơn! Điều đó hoạt động – myborobudur

Trả lời

35

Phương thức thenReturn sẽ luôn trả về những gì được chuyển cho nó. Mã số new Servicemock() đang được thực hiện trước cuộc gọi đến thenReturn. Sau đó, số ServiceMock được tạo sẽ được chuyển đến thenReturn. Do đó thenReturn có trường hợp tuyệt đối là ServiceMock không phải là cơ chế tạo.

Nếu bạn cần cung cấp một thể hiện mới, sử dụng thenAnswer

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

Cảm ơn rất nhiều vì đã cứu ngày của tôi :) –

10

Bạn có thể muốn Refactor đó vào báo cáo khác nhau để hiểu tại sao điều đó xảy ra.

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

Bây giờ bạn có thấy lý do tại sao nó không hoạt động? :)

Nó luôn trả về trạng thái giữ trong svc, nó sẽ không đánh giá lại new ServiceMock() mỗi khi phương thức được gọi.

+1

Bạn đã đúng! Cảm ơn! – myborobudur

3

Trong Java 8 với Lambdas bạn có thể chỉ cần sử dụng

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

Vì vậy, chỉ cần thay thế .thenReturn(new MyMock());

với .thenAnswer(invocation -> new MyMock());