Проблемы с тестированием приложения Spring Boot с настройкой проекта Multi Maven

В настоящее время я сталкиваюсь с некоторыми проблемами со структурой проекта spring boot и multi maven. Я использую Spring Boot 4.3.1.

Структура моего проекта выглядит следующим образом:

parent
-- pom.xml
-- application
   -- pom.xml
   -- src
      -- main
         -- java
            -- Application.java (annotated with @SpringBootApplication)
      -- test
         -- java 
            -- MyApplicationTest.java (annotated with @SpringBootTest)
-- library
   -- pom.xml
   -- src
      -- main
         -- java (...)
      -- test
         -- java
            -- MyLibraryTest.java (annotated with @SpringBootTest)

Модуль application зависит от модуля library.

MyApplicationTest работает отлично, но вместо этого при запуске MyLibraryTest возникает следующая ошибка:

    java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test at org.springframework.util.Assert.state(Assert.java:392)
    at  org.springframework.boot.test.context.SpringBootTestContextBootstrapper.getOr FindConfigurationClasses(SpringBootTestContextBootstrapper.java:173)
    at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.processMergedContextConfiguration(SpringBootTestContextBootstrapper.java:133)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:409)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:305)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:112)
    at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.buildTestContext(SpringBootTestContextBootstrapper.java:78)
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:120)
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:105)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:152)

Мое первое предположение состоит в том, что library нуждается в зависимости от application, но это вызывает цикл.

Есть ли решение этой проблемы? Как я могу правильно структурировать свое приложение?

большое спасибо за предложения.

MyLibraryTest выглядит следующим образом:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Transactional
    public class MyLibraryTest {
       @Autowired
       private MyService service;

       @Test
       public void testMyService_Save() {...}

    }

person user3278695    schedule 05.03.2017    source источник
comment
поделитесь кодом MyLibraryTest, где вы нашли ошибку. Кроме того, убедитесь, что в его pom определены все необходимые зависимости (как уже определено в приложении -> pom.xml ) для @SpringBootTest   -  person Naman    schedule 05.03.2017
comment
stackoverflow .com/questions/39084491/ поможет в этом случае. Возможно, это дубликат самого этого.   -  person Naman    schedule 05.03.2017


Ответы (1)


Вы должны убедиться, что модуль library pom.xml включает в себя -

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-test</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>

который необходим для того, чтобы модуль использовал аннотацию @SpringBootTest. Возможно, вы уже используете его в своем модуле app, но он не включен в модуль library.


Хорошо опубликуйте Edit, обнаружил, что вопрос, возможно, является дубликатом Не удалось найти @SpringBootConfiguration при выполнении JpaTest

Также цитируя ответ Томаса из той же темы, здесь

Суть @DataJpaTest и некоторых других аннотаций заключается в том, что они ищут аннотацию @SpringBootConfiguration в текущем пакете, и если они не могут ее там найти, они обходят иерархию пакетов, пока не найдут ее.

Например, если полное имя для вашего тестового класса было com.example.test.JpaTest, а для вашего приложения — com.example.Application, то ваш тестовый класс сможет найти @SpringBootApplication (и в нем @SpringBootConfiguration).

Однако если приложение находится в другой ветви иерархии пакетов, например com.example.application.Application, оно не найдет его.

что, похоже, имеет место для вас, когда вы пытаетесь протестировать приложение в другом модуле. Отсюда и ошибка, которую вы видите.

person Naman    schedule 05.03.2017
comment
@user3278695 user3278695, как и ранее, отредактируйте вопрос и поделитесь кодом для MyLIbraryTest, чтобы увидеть дальше - person Naman; 05.03.2017
comment
Итак, как бы вы это исправили? - person Niby; 01.11.2019