Меня попросили создать интеграционный тест для сервиса в очень большом проекте SpringBoot, дающий десятки реализованных сервисов. Когда приложение выполняется, все эти службы развернуты - я хочу избежать развертывания всех служб, не связанных с той, для которой я создаю тест. К сожалению, у меня (пока) нет такого большого опыта в весенних загрузочных тестах, как хотелось бы надеяться, поэтому мне было интересно, как лучше всего это решить.
Я думал о том, чтобы аннотировать все несвязанные сервисы с @MockBean
аннотации @MockBean
и все связанные с @Autowire
с помощью @Autowire
в тестовом классе, но я не уверен, что это правильный путь. Может кто-то указать мне верное направление?
Спасибо.
Всего 2 ответа
Ответ во многом зависит от объема вашего интеграционного теста. Я постараюсь охватить два основных способа, и вы можете погуглить нас, чтобы получить больше примеров и подробностей. Документация по тестированию Spring Boot также является вашим другом.
Ломтики
Spring Boot предоставляет тестовые утилиты, называемые слайсами . Например, есть фрагмент для тестирования ваших контроллеров - @WebMvcTest
- этот тест загрузит всю конфигурацию для вызова вашего приложения из HTTP и указанного вами контроллера. После этого вам нужно решить, что делать с зависимостями этого контроллера.
Вы можете:
@MockBean
их с @MockBean
. @Import
(и тогда вам снова придется иметь дело с зависимостями вновь импортированной зависимости). @AutoConfigureSomething
аннотаций @AutoConfigureSomething
. - Все фрагменты в основном являются композициями автоконфигурационных аннотаций, и вы можете свободно добавлять их в свои тесты. Например, посмотрите на аннотации на DataJpaTest, чтобы узнать, как добавить возможность настройки Spring Boot Data JPA с тестовой базой данных. Вы можете иметь максимум один срез для вашего теста, но вы можете импортировать любое количество дополнительных сервисов, конфигураций, макетов, автоконфигураций и т. Д. Дело в том, что вы выбираете то, что настроено для вашего теста; новые несвязанные сервисы с новыми зависимостями не должны нарушать существующие тесты.
SpringBootTest
Другой подход - аннотация @SpringBootTest
- она идет в противоположном направлении - по умолчанию она загружает все, и вы можете исключить @MockBean
вещи с помощью @MockBean
, @EnableAutoConfiguration(exclude=SomeClass)
и т. Д.
Конечно, существует опасность нарушения существующих тестов при добавлении новых сервисов. - Это не должно происходить слишком часто, поскольку все настраивается автоматически, но это все еще возможно, особенно в монолите с большей конфигурацией.
Если вам нужно создать тесты интеграции с пружиной, вы должны: - вызвать контекст Spring с помощью аннотации для класса теста - например: @RunWith (SpringJUnit4ClassRunner.class) - использовать аннотацию @MockBean или @SpyBean для сервисов, которые вы не собираетесь тестировать но они являются частью методов / класса тестирования - используйте аннотацию @Autowired для класса, который вы собираетесь тестировать. Для проверки результатов вы можете использовать утверждения Junit4 или Junit5, а для проверки поведения вы можете использовать Mockito