Ответ 1
Короткий ответ заключается в том, что в вашем примере результат mock.method()
будет пустым значением, соответствующим типу; mockito использует косвенную передачу через прокси-сервер, метод перехвата и общий экземпляр класса MockingProgress
, чтобы определить, является ли вызов метода для макета для обнуления или повторения существующего затушеванного поведения, а не передачи информации о выполнении stubbing через возвращаемое значение издевающегося метода.
Мини-анализ через пару минут, глядя на код mockito, выглядит следующим образом. Заметьте, это очень грубое описание - здесь есть много деталей. Я предлагаю вам самостоятельно проверить источник на github.
Во-первых, когда вы издеваетесь над классом с помощью метода mock
класса Mockito
, это, по сути, происходит:
-
Mockito.mock
делегируетorg.mockito.internal.MockitoCore
.mock, передавая настройки макета по умолчанию в качестве параметра. -
MockitoCore.mock
делегируетorg.mockito.internal.util.MockUtil
.createMock - Класс
MockUtil
использует классClassPathLoader
для получения экземпляраMockMaker
для использования для создания макета. По умолчанию используется класс CgLibMockMaker. -
CgLibMockMaker
использует класс, заимствованный из JMock,ClassImposterizer
, который обрабатывает создание макета. Ключевыми элементами магии "mockito magic" являютсяMethodInterceptor
, используемые для создания макета: mockitoMethodInterceptorFilter
и цепочка экземпляров MockHandler, включая экземпляр MockHandlerImpl. Метод перехватчика передает вызовы экземпляру MockHandlerImpl, который реализует бизнес-логику, которая должна применяться при вызове метода на макет (т.е. Поиск, чтобы проверить, был ли уже записан ответ, определяя, является ли вызов новым заглушкой и т.д. Состояние по умолчанию: если заглушка еще не зарегистрирована для вызываемого метода, возвращается возвращаемое значение типа.
Теперь посмотрим на код в вашем примере:
when(mock.method()).thenReturn(someValue)
Вот порядок выполнения этого кода:
-
mock.method()
-
when(<result of step 1>)
-
<result of step 2>.thenReturn
Ключом к пониманию того, что происходит, является то, что происходит, когда вызывается метод на mock: перехватчик метода передается информация о вызове метода и делегирует его цепочке экземпляров MockHandler
, которые в конечном итоге делегируются MockHandlerImpl#handle
. Во время MockHandlerImpl#handle
обработчик mock создает экземпляр OngoingStubbingImpl
и передает его в общий экземпляр MockingProgress
.
Когда метод when
вызывается после вызова method()
, он делегирует MockitoCore.when
, который вызывает метод stub()
того же класс. Этот метод распаковывает текущее завершение из общего экземпляра MockingProgress
, в который вызывается посмеянный вызов method()
и возвращает его. Затем в экземпляре OngoingStubbing
вызывается метод thenReturn
.