Mockito thenReturn возвращает тот же экземпляр - PullRequest
20 голосов
/ 22 ноября 2011

У меня есть это в Mockito:

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

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

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

Ответы [ 3 ]

47 голосов
/ 22 ноября 2011

Метод 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();
     }
   });
10 голосов
/ 22 ноября 2011

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

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

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

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

4 голосов
/ 23 февраля 2017

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

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

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

на .thenAnswer(invocation -> new MyMock());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...