Mockito thenReturn返回相同的实例

myb*_*dur 21 java unit-testing mockito

我在Mockito有这个:

when(mockedMergeContext.createNewEntityOfType(IService.class)).thenReturn(new ServiceMock());
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*n B 48

该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();
     }
   });
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢您节省了我的一天:) (2认同)

pti*_*son 12

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

when(mockedMergeContext.createNewEntityOfType(IService.class)).thenAnswer(invocation -> new ServiceMock());
Run Code Online (Sandbox Code Playgroud)

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

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


Aug*_*sto 10

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

Service svc = new ServiceMock();
when(mockedMergeContext.createNewEntityOfType(IService.class)).thenReturn( svc );
Run Code Online (Sandbox Code Playgroud)

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

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