При использовании аннотации @Spy
Mockito оборачивает существующий экземпляр в шпионский объект.Аннотация @Spy
работает следующим образом:
Abc spyAbc = Mockito.spy(new Abc());
Это означает, что эти два выражения приведут к одному и тому же:
@Spy Abc abc = new Abc();
Abc abc = Mockito.spy(new Abc());
Следующее выражение будет работать только при наличииконструктор по умолчанию:
@Spy Abc abc;
При использовании шпионов шпионский объект ведет себя так же, как и ваша исходная реализация (хотя вы можете определить поведение пользовательского теста, например, с помощью
Mockito.doReturn(1).when(abc).myMethod();
Напротив, с помощью mockОбъекты (Mockito.mock(Abc.class)
) не будут обеспечивать такое же поведение, как ваша исходная реализация, поскольку они не являются реальным экземпляром вашего класса.
Если вы хотите шпионить за бобами Spring, у вас есть следующие способы:
Используйте @SpyBean
(см .: https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/mock/mockito/SpyBean.html), например:
@SpyBean
private Abc abc;
Или используйте @Autowired
и @Spy
вместе
@Spy
@Autowired
private Abc abc;
Обаспособы будут работать. Обратите внимание на разницу when(abc.method()).thenReturn(1);
и doReturn(1).when(abc).method();
. Только в первом сценарии действительно вызывается method()
(и только возвращается). Во втором примере метод не будет вызыватьсяЭта разницаважно знать, есть ли у метода побочные эффекты.