У нас есть модульный монолит с многомодульной структурой проекта maven, использующей spring-boot и выполняющей интеграционное тестирование через @SpringBootTest
, который загружает специфичный для модуля Spring ApplicationContext, в котором выполняются интеграционные тесты с использованием полных DI, JPA-Connections и т. д.
Во всех этих модулях мы используем концепцию «AdminControllers», а в центральном «основном» модуле, от которого зависят и @ComponentScan
все остальные модули, у нас есть центральный
AdminControllerIntegrationTest
, который устанавливает определенные свойства для всех компонентов AdminController-Beans, например наличие аннотаций, связанных с безопасностью.
Этот «основной» @SpringBootTest
AdminControllerIntegrationTest запускается один раз в Application-Context, специфичном для модуля core
, где он видит все компоненты ядра — и это нормально. Однако во всех других модулях этот IntegrationTest никогда не выполняется и не может проверить ни один из их bean-компонентов.
Есть ли возможность, чтобы этот центральный @SpringBootTest
запускался автоматически во всех модулях отдельно в их собственных контекстах приложений?
Что-то не так в этой настройке, позвольте мне объяснить:
Итак, вы говорите, что у вас есть «основной» модуль с собственным тестом @SpringBootTest
, что означает, что это приложение для загрузки Spring.
С другой стороны, вы говорите, что у вас есть модули A и B, которые сами по себе являются весенними загрузочными приложениями. Но если это так, они не могут зависеть от другого приложения весенней загрузки (ядра), я имею в виду, что модуль приложения весенней загрузки не может зависеть от другого модуля приложения весенней загрузки, это не имеет смысла и не работает в maven.
Еще один концерт, который приходит мне на ум: в любом приложении с весенней загрузкой мы обычно используем «плагины», такие как: система измерения, система регистрации, привод и так далее. Обычно для этой цели есть стартеры, мы определяем их в maven, и загрузочное приложение Spring загружает их автоматически. Однако мы относимся к ним как к «сторонним» в нашем приложении и никогда не запускаем «их» тесты при компиляции нашего приложения. То, что вы описали, противоречит этому подходу.
Итак, в моем понимании (и опять же, я могу ошибаться), вы должны:
Создайте стартер (модуль автоконфигурации) из вашего «основного» модуля. Это не будет весеннее загрузочное приложение само по себе, и на нем не будет @SpringBootTest. Только простые модульные/интеграционные тесты (возможно, управляемые Spring, но не Spring boot в смысле того, что делает @SpringBootTest). У вас также не будет spring-boot-maven-plugin
в pom этого модуля, а также не будет метода main
ни в одном классе (вообще никакого @SpringBootApplication
).
В модулях А и Б - подключите этот модуль автоконфигурации, он загрузится автоматически и обеспечит требуемый функционал. Тесты модуля A должны тестировать код/потоки модуля A и не должны проверять функциональность «основного» модуля, это для «основных» тестов, чтобы проверить функциональность «основного» модуля.
В модулях A и B, когда у вас есть @SpringBootTest
, будет загружен основной модуль, и часть вашего кода может сломаться, потому что он не «соответствует ожиданиям» основного модуля (например, вы не разместили правильную аннотацию или что-то в этом роде) - в этом случае тест не пройдёт и вам придётся исправлять код модуля А, например.
Обновление 1 После прочтения комментариев:
Я думаю, что это возможно, и решение должно включать следующие шаги:
Из ядра модуля, содержащего тест AdminControllerIntegrationTest
, создайте дополнительный тестовый артефакт jar. эта ссылка содержит технические инструкции того, что должно быть размещено в pom.xml
ядре модуля.
Модули вашего приложения весенней загрузки должны зависеть от этого тестового артефакта в тесте области, примерно так:
<dependency>
<groupId>com.foo</groupId>
<artifactId>core</artifactId>
<version>1.0</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
dependenciesToScan
, который будет содержать ядро модуля, так что во время сборки вашего весеннего загрузочного приложения плагин также будет запускать AdminControllerIntegrationTest
. По крайней мере, это будет в пути к классам тестов... Оттуда вам может потребоваться выполнить некоторые настройки на уровне весны, не видя кода, трудно сказать, что происходит. См. эту тему для получения дополнительной информации.мы относимся к ним как к «третьим сторонам» в нашем приложении и никогда не запускаем «их» тесты при компиляции нашего приложения. мы делаем то же самое и позволяем модулям maven запускать свои «собственные тесты». в этом особом случае я ищу отвлечение от этого, хотя
и на нем не будет SpringBootTest. Только простые модульные/интеграционные тесты (возможно, управляемые Spring, но не Spring boot в смысле того, что делает @SpringBootTest). почему это важно?
@hotzen: я обновил ответ. Я не пробовал это сам, поэтому, пожалуйста, сообщите, сработало ли это для вас, или вы столкнулись с другими трудностями. Спасибо
извините за столь поздний ответ, не прочитал уведомление - большое спасибо за это обновление, попробую dependenciesToScan
и ссылки - спасибо!!
спасибо за ваш подробный ответ, относительно того, что они не могут зависеть от другого приложения весенней загрузки (ядра), я имею в виду, что модуль приложения весенней загрузки не может зависеть от ядра другого модуля приложения весенней загрузки, само по себе не является фактическим
@SpringBootApplication
, однако его собственные интеграционные тесты делают действительно определите@SpringBootTest(classes = CoreIntegrationTestApp.class)
только ради загрузки контекста приложения-теста интеграции