Подтвердить что ты не робот

Mockito thenReturn возвращает тот же экземпляр

У меня это в Mockito:

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

Метод createNewEntityOfType должен всегда возвращать новый экземпляр ServiceMock, но он возвращает дважды ту же ссылку.

Почему метод thenReturn не возвращает новый ServiceMock?

4b9b3361

Ответ 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

Возможно, вы захотите реорганизовать это в разные выражения, чтобы понять, почему это происходит.

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

Вы видите, почему это не работает?:)

Он всегда возвращает удержание экземпляра в svc, он не будет переоценивать new ServiceMock() каждый раз при вызове метода.

Ответ 3

В Java 8 с Lambdas вы можете просто использовать

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

Так что просто замените .thenReturn(new MyMock());

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