Хочу немного добавить к Габриэлю Пиментасу отличный ответ. Причина, по которой это работает так, как работает, состоит в том, что mockito создает мелкие копии шпиона new Sut()
, а ваш Supplier
ссылается на скомпилированный лямбда-метод внутри исходного экземпляра Sut
, а не на экземпляр шпиона.
См. Также этот вопрос и документация по мокито .
Когда вы отлаживаете свой код, вы можете увидеть, как это работает:
Sut sut = spy(new Sut());
теперь является поддельным / шпионским подклассом Sut
в качестве экземпляра TestTimes$Sut$MockitoMock$1381634547@5b202a3a
. Теперь все поля из оригинального new Sut()
копируются на мелкие участки, включая Supplier<Object> data
. Глядя на это поле внутри шпиона, мы видим, что это экземпляр TestTimes$Sut$$Lambda$1/510109769@1ecee32c
, то есть указатель на лямбду внутри оригинального Sut
. Когда мы устанавливаем точку останова внутри метода create, мы также можем заметить, что this
указывает на TestTimes$Sut@232a7d73
, то есть на исходный Sut
, а не на шпионский экземпляр.
РЕДАКТИРОВАТЬ: Хотя этот MCVE, вероятно, не похож на ваш реальный код, на ум приходят следующие решения:
- Введите поставщика в ваш
Sut
(либо во время строительства, либо в качестве параметра getData
.
- Создайте поставщика лениво в вашем методе
getData
(чтобы он указывал на экземпляр mockito)
- Не используйте поставщика, а просто позвоните
create
напрямую, если поставщик не пропущен извне