Создание интеграционных тестов в монолитном приложении SpringBoot

Меня попросили создать интеграционный тест для сервиса в очень большом проекте SpringBoot, дающий десятки реализованных сервисов. Когда приложение выполняется, все эти службы развернуты - я хочу избежать развертывания всех служб, не связанных с той, для которой я создаю тест. К сожалению, у меня (пока) нет такого большого опыта в весенних загрузочных тестах, как хотелось бы надеяться, поэтому мне было интересно, как лучше всего это решить.

Я думал о том, чтобы аннотировать все несвязанные сервисы с @MockBean аннотации @MockBean и все связанные с @Autowire с помощью @Autowire в тестовом классе, но я не уверен, что это правильный путь. Может кто-то указать мне верное направление?

Спасибо.

Всего 2 ответа


Ответ во многом зависит от объема вашего интеграционного теста. Я постараюсь охватить два основных способа, и вы можете погуглить нас, чтобы получить больше примеров и подробностей. Документация по тестированию Spring Boot также является вашим другом.

Ломтики

Spring Boot предоставляет тестовые утилиты, называемые слайсами . Например, есть фрагмент для тестирования ваших контроллеров - @WebMvcTest - этот тест загрузит всю конфигурацию для вызова вашего приложения из HTTP и указанного вами контроллера. После этого вам нужно решить, что делать с зависимостями этого контроллера.

Вы можете:

  • @MockBean их с @MockBean .
  • Обеспечьте реальную реализацию (или дополнительную настройку) с помощью @Import (и тогда вам снова придется иметь дело с зависимостями вновь импортированной зависимости).
  • Загрузите дополнительную часть автоконфигурации Spring Boot. Это можно сделать с @AutoConfigureSomething аннотаций @AutoConfigureSomething . - Все фрагменты в основном являются композициями автоконфигурационных аннотаций, и вы можете свободно добавлять их в свои тесты. Например, посмотрите на аннотации на DataJpaTest, чтобы узнать, как добавить возможность настройки Spring Boot Data JPA с тестовой базой данных.

Вы можете иметь максимум один срез для вашего теста, но вы можете импортировать любое количество дополнительных сервисов, конфигураций, макетов, автоконфигураций и т. Д. Дело в том, что вы выбираете то, что настроено для вашего теста; новые несвязанные сервисы с новыми зависимостями не должны нарушать существующие тесты.

SpringBootTest

Другой подход - аннотация @SpringBootTest - она ​​идет в противоположном направлении - по умолчанию она загружает все, и вы можете исключить @MockBean вещи с помощью @MockBean , @EnableAutoConfiguration(exclude=SomeClass) и т. Д.

Конечно, существует опасность нарушения существующих тестов при добавлении новых сервисов. - Это не должно происходить слишком часто, поскольку все настраивается автоматически, но это все еще возможно, особенно в монолите с большей конфигурацией.


Если вам нужно создать тесты интеграции с пружиной, вы должны: - вызвать контекст Spring с помощью аннотации для класса теста - например: @RunWith (SpringJUnit4ClassRunner.class) - использовать аннотацию @MockBean или @SpyBean для сервисов, которые вы не собираетесь тестировать но они являются частью методов / класса тестирования - используйте аннотацию @Autowired для класса, который вы собираетесь тестировать. Для проверки результатов вы можете использовать утверждения Junit4 или Junit5, а для проверки поведения вы можете использовать Mockito


Есть идеи?

10000