Весна (@SpyBean) против Мокито(@Spy)

Чем отличается @SpyBean от org.springframework.boot.test.mock.mockito.SpyBean и @Spy от org.mockito.Spy?

Использование @SpyBean вместо @Spy делает мой тесты не пройдены.


person LiTTle    schedule 15.02.2019    source источник


Ответы (2)


@Spy doc говорит:

Поле, аннотированное @Spy, может быть явно инициализировано в точке объявления. В качестве альтернативы, если вы не предоставите экземпляр, Mockito попытается найти конструктор с нулевым аргументом (даже частный) и создать для вас экземпляр.

@SpyBean doc< /а> говорит:

Аннотация, которую можно использовать для применения шпионов Mockito к Spring ApplicationContext.

Все бины в контексте одного типа будут обернуты шпионом. Если существующий компонент не определен, будет добавлен новый.

Таким образом, основное отличие заключается в том, что @SpyBean — это аннотация, специфичная для Spring Boot, но @Spy является частью самого Mockito. @SpyBean и @Spy в основном делают то же самое, но @SpyBean может разрешать специфические зависимости Spring, например. @Autowired, @Spy могут создавать объекты только с пустым конструктором.

person csenga    schedule 18.02.2019
comment
Итак, @SpyBean загрузит bean-компонент из экземпляра, который уже существует в контейнере Spring, а @Spy создаст совершенно новый объект, независимо от того, существует ли он уже в контейнере Spring или нет? - person LiTTle; 18.02.2019
comment
@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 и прохождению обоих тестов.

person A Singleton    schedule 03.03.2021