【问题标题】:Mockito thenReturn returns same instanceMockito thenReturn 返回相同的实例
【发布时间】:2011-11-22 13:15:18
【问题描述】:
我在 Mockito 中有这个:
when(mockedMergeContext.createNewEntityOfType(IService.class)).thenReturn(new ServiceMock());
createNewEntityOfType 方法应始终返回一个新的 ServiceMock 实例,但它会返回两次相同的引用。
为什么thenReturn 方法不返回新的ServiceMock?
【问题讨论】:
标签:
java
unit-testing
mockito
【解决方案1】:
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();
}
});
【解决方案2】:
在带有 Lambda 的 Java 8 中,您可以使用
when(mockedMergeContext.createNewEntityOfType(IService.class)).thenAnswer(invocation -> new ServiceMock());
所以只需替换.thenReturn(new MyMock());
.thenAnswer(invocation -> new MyMock());
【解决方案3】:
您可能希望将其重构为不同的语句以了解发生这种情况的原因。
Service svc = new ServiceMock();
when(mockedMergeContext.createNewEntityOfType(IService.class)).thenReturn( svc );
你现在明白为什么它不起作用了吗? :)
它总是返回 svc 中的实例持有,它不会在每次调用该方法时重新评估 new ServiceMock()。