Чем отличается @SpyBean
от org.springframework.boot.test.mock.mockito.SpyBean
и @Spy
от org.mockito.Spy
?
Использование @SpyBean
вместо @Spy
делает мой тесты не пройдены.
Чем отличается @SpyBean
от org.springframework.boot.test.mock.mockito.SpyBean
и @Spy
от org.mockito.Spy
?
Использование @SpyBean
вместо @Spy
делает мой тесты не пройдены.
@Spy
doc говорит:
Поле, аннотированное @Spy, может быть явно инициализировано в точке объявления. В качестве альтернативы, если вы не предоставите экземпляр, Mockito попытается найти конструктор с нулевым аргументом (даже частный) и создать для вас экземпляр.
@SpyBean
doc< /а> говорит:
Аннотация, которую можно использовать для применения шпионов Mockito к Spring ApplicationContext.
Все бины в контексте одного типа будут обернуты шпионом. Если существующий компонент не определен, будет добавлен новый.
Таким образом, основное отличие заключается в том, что @SpyBean
— это аннотация, специфичная для Spring Boot, но @Spy
является частью самого Mockito. @SpyBean
и @Spy
в основном делают то же самое, но @SpyBean
может разрешать специфические зависимости Spring, например. @Autowired
, @Spy
могут создавать объекты только с пустым конструктором.
@SpyBean
загрузит bean-компонент из экземпляра, который уже существует в контейнере Spring, а @Spy
создаст совершенно новый объект, независимо от того, существует ли он уже в контейнере Spring или нет?
- person LiTTle; 18.02.2019
@Spy
работает, как вы сказали, но в случае @SpyBean
документ говорит: все bean-компоненты в контексте одного типа будут обернуты шпионом. Если существующий компонент не определен, будет добавлен новый.
- person csenga; 18.02.2019
Что-то, что я заметил во время тестирования, это то, что SpyBean может привести к переносу определенных значений между тестами, тогда как Spy всегда начинает с чистого листа. В моем случае я установил @SpyBean для класса, который изначально имел автосвязанные компоненты. Но после того, как я провел рефакторинг класса, чтобы удалить их, я не изменил тестовые классы, и у меня произошел неожиданный сбой.
Class1 {
boolean boo;
myMethodA() {
if (something) {
boo=true;
}
}
myMethodB() {
if (boo) {
doThis();
} else {
doThat();
}
}
}
И Test1, и Test2 использовали @SpyBean Class1. И Test1, и Test2 успешно выполнялись изолированно, но при запуске в виде комплекта Test2 завершится ошибкой, если он запустится после Test1.
Test1 присвоил логическому значению в Class1 значение true, которое оставалось истинным при запуске Test2. Это привело к сбою Test2, поскольку он ожидал, что логическое значение будет ложным. Изменение на @Spy Class1 привело к сбросу логического значения в false и прохождению обоих тестов.