Mockito thenReturn返回相同的实例

我在Mockito有这个:

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

createNewEntityOfType方法应始终返回一个新的ServiceMock实例,但它返回相同引用的两倍。

为什么thenReturn方法不返回新的ServiceMock

thenReturn方法将始终返回传递给它的内容。 new Servicemock()代码在调用thenReturn之前执行。 然后将创建的ServiceMock传递给thenReturn 。 因此, thenReturn具有ServiceMock的绝对实例而不是创建机制。

如果您需要提供新实例,请使用thenAnswer

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

您可能希望将其重构为不同的语句,以了解发生这种情况的原因。

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

你现在看到为什么它不起作用? 🙂

它始终在svc中返回实例保持,每次调用该方法时都不会重新评估new ServiceMock()

在使用Lambdas的Java 8中,您可以使用

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

所以只需替换.thenReturn(new MyMock());

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