【问题标题】: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 -&gt; new MyMock());

【讨论】:

    【解决方案3】:

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

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

    你现在明白为什么它不起作用了吗? :)

    它总是返回 svc 中的实例持有,它不会在每次调用该方法时重新评估 new ServiceMock()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 1970-01-01
      • 2014-12-28
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多