Центральный SpringBootTest, который запускается в ApplicationContext каждого модуля maven отдельно

У нас есть модульный монолит с многомодульной структурой проекта maven, использующей spring-boot и выполняющей интеграционное тестирование через @SpringBootTest, который загружает специфичный для модуля Spring ApplicationContext, в котором выполняются интеграционные тесты с использованием полных DI, JPA-Connections и т. д.

Во всех этих модулях мы используем концепцию «AdminControllers», а в центральном «основном» модуле, от которого зависят и @ComponentScan все остальные модули, у нас есть центральный AdminControllerIntegrationTest, который устанавливает определенные свойства для всех компонентов AdminController-Beans, например наличие аннотаций, связанных с безопасностью.

Этот «основной» @SpringBootTest AdminControllerIntegrationTest запускается один раз в Application-Context, специфичном для модуля core, где он видит все компоненты ядра — и это нормально. Однако во всех других модулях этот IntegrationTest никогда не выполняется и не может проверить ни один из их bean-компонентов.

Есть ли возможность, чтобы этот центральный @SpringBootTest запускался автоматически во всех модулях отдельно в их собственных контекстах приложений?

Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Интеграция Slack и Spring Boot: как отправлять сообщения из Java-приложений
Интеграция Slack и Spring Boot: как отправлять сообщения из Java-приложений
Как отправлять сообщения в slack с помощью spring boot легко и без зависимостей.
0
0
245
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что-то не так в этой настройке, позвольте мне объяснить:

Итак, вы говорите, что у вас есть «основной» модуль с собственным тестом @SpringBootTest, что означает, что это приложение для загрузки Spring.

С другой стороны, вы говорите, что у вас есть модули A и B, которые сами по себе являются весенними загрузочными приложениями. Но если это так, они не могут зависеть от другого приложения весенней загрузки (ядра), я имею в виду, что модуль приложения весенней загрузки не может зависеть от другого модуля приложения весенней загрузки, это не имеет смысла и не работает в maven.

Еще один концерт, который приходит мне на ум: в любом приложении с весенней загрузкой мы обычно используем «плагины», такие как: система измерения, система регистрации, привод и так далее. Обычно для этой цели есть стартеры, мы определяем их в maven, и загрузочное приложение Spring загружает их автоматически. Однако мы относимся к ним как к «сторонним» в нашем приложении и никогда не запускаем «их» тесты при компиляции нашего приложения. То, что вы описали, противоречит этому подходу.

Итак, в моем понимании (и опять же, я могу ошибаться), вы должны:

  1. Создайте стартер (модуль автоконфигурации) из вашего «основного» модуля. Это не будет весеннее загрузочное приложение само по себе, и на нем не будет @SpringBootTest. Только простые модульные/интеграционные тесты (возможно, управляемые Spring, но не Spring boot в смысле того, что делает @SpringBootTest). У вас также не будет spring-boot-maven-plugin в pom этого модуля, а также не будет метода main ни в одном классе (вообще никакого @SpringBootApplication).

  2. В модулях А и Б - подключите этот модуль автоконфигурации, он загрузится автоматически и обеспечит требуемый функционал. Тесты модуля A должны тестировать код/потоки модуля A и не должны проверять функциональность «основного» модуля, это для «основных» тестов, чтобы проверить функциональность «основного» модуля.

  3. В модулях A и B, когда у вас есть @SpringBootTest, будет загружен основной модуль, и часть вашего кода может сломаться, потому что он не «соответствует ожиданиям» основного модуля (например, вы не разместили правильную аннотацию или что-то в этом роде) - в этом случае тест не пройдёт и вам придётся исправлять код модуля А, например.

Обновление 1 После прочтения комментариев:

Я думаю, что это возможно, и решение должно включать следующие шаги:

  1. Из ядра модуля, содержащего тест AdminControllerIntegrationTest, создайте дополнительный тестовый артефакт jar. эта ссылка содержит технические инструкции того, что должно быть размещено в pom.xml ядре модуля.

  2. Модули вашего приложения весенней загрузки должны зависеть от этого тестового артефакта в тесте области, примерно так:

<dependency>
  <groupId>com.foo</groupId>
  <artifactId>core</artifactId>
  <version>1.0</version>
  <type>test-jar</type>
  <scope>test</scope>
</dependency>
  1. С этого момента это становится сложным, потому что это действительно зависит от того, что именно происходит в тесте и как Spring все подключает. В «самой простой» ситуации для этого шага вам нужно будет убедиться, что ваш плагин surefire/failsafe имеет версию 2.15+. : в этой версии добавлена ​​поддержка параметра dependenciesToScan, который будет содержать ядро ​​модуля, так что во время сборки вашего весеннего загрузочного приложения плагин также будет запускать AdminControllerIntegrationTest. По крайней мере, это будет в пути к классам тестов... Оттуда вам может потребоваться выполнить некоторые настройки на уровне весны, не видя кода, трудно сказать, что происходит. См. эту тему для получения дополнительной информации.

спасибо за ваш подробный ответ, относительно того, что они не могут зависеть от другого приложения весенней загрузки (ядра), я имею в виду, что модуль приложения весенней загрузки не может зависеть от ядра другого модуля приложения весенней загрузки, само по себе не является фактическим @SpringBootApplication, однако его собственные интеграционные тесты делают действительно определите @SpringBootTest(classes = CoreIntegrationTestApp.class) только ради загрузки контекста приложения-теста интеграции

hotzen 22.12.2020 15:19

мы относимся к ним как к «третьим сторонам» в нашем приложении и никогда не запускаем «их» тесты при компиляции нашего приложения. мы делаем то же самое и позволяем модулям maven запускать свои «собственные тесты». в этом особом случае я ищу отвлечение от этого, хотя

hotzen 22.12.2020 15:20

и на нем не будет SpringBootTest. Только простые модульные/интеграционные тесты (возможно, управляемые Spring, но не Spring boot в смысле того, что делает @SpringBootTest). почему это важно?

hotzen 22.12.2020 15:22

@hotzen: я обновил ответ. Я не пробовал это сам, поэтому, пожалуйста, сообщите, сработало ли это для вас, или вы столкнулись с другими трудностями. Спасибо

Mark Bramnik 22.12.2020 17:13

извините за столь поздний ответ, не прочитал уведомление - большое спасибо за это обновление, попробую dependenciesToScan и ссылки - спасибо!!

hotzen 07.01.2021 20:02

Другие вопросы по теме