Mockito thenReturn返回相同的实例

时间:2011-11-22 13:15:19

标签: java unit-testing mockito

我在Mockito中有这个:

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

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

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

3 个答案:

答案 0 :(得分:46)

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

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

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

答案 1 :(得分:10)

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

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

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

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

答案 2 :(得分:4)

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

.thenReturn(new MyMock());

所以只需替换.thenAnswer(invocation -> new MyMock());

{{1}}