Mockito thenReturn возвращает тот же экземпляр
У меня это в Mockito:
when(mockedMergeContext.createNewEntityOfType(IService.class)).thenReturn(new ServiceMock());
Метод createNewEntityOfType
должен всегда возвращать новый экземпляр ServiceMock
, но он возвращает дважды ту же ссылку.
Почему метод thenReturn
не возвращает новый ServiceMock
?
Ответы
Ответ 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());