Maven тест бросает SpringBootTest, не может найти @SpringBootConfiguration, вам нужно использовать @ContextConfiguration или @SpringBootTest - PullRequest
0 голосов
/ 29 июня 2019

У меня есть проект весенней загрузки со следующей структурой

src
|--- main
|    |--- java
|    |    |--- io.example.config
|    |    |    |--- AppConfig (Annotated @Cofiguration)
|    |    |--- io.example.beans 
|    |    |    |--- Bean1 (Annotated @Component)
|    |    |    |--- Bean2 (Annotated @Component)
|    |    |--- io.example.repository
|    |    |    |--- Repo (DynamoDB Crud Repo; Annotated @EnableScane)
|    |    |--- io.example.main
|    |    |    |--- Application (Annotated @SpringBootApplication)
|    |--- module-info.java
|--- test
|    |--- java
|    |    |--- io.example.main
|    |    |    |--- IntTest (Annotated @SpringBootTest)

Код в классе IntTest выглядит как

@RunWith(SpringRunner.class)
@SpringBootTest
public class IntTest {
  ...
}

Когда я запускаю тесты из IntelliJ, он работает нормально. Но я запускаю его из maven mvn test он выдает следующую ошибку

Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

Я прочитал некоторые документы и похожие вопросы в SO. Большая часть решения исправляет выравнивание пакетов между исходной и тестовой папками. В моем случае это не проблема.

Тест выполняется нормально с mvn test, когда я делаю следующее, я явно определяю контекстные зависимости

package io.example.main;

import org.springframework.test.context.junit4.SpringRunner;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import io.example.config.AppConfig;
import io.example.beans.Bean1;
import io.example.beans.Bean2;

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = { Application.class, AppConfig.class, Bean1.class, Bean2.class })
@SpringBootTest
public class IntTest {
  ...

  @Autowired
  private Bean1 b1;

  @Autowired
  private Bean2 b2;

  @Test
  public void testRandom() {
      /* assert statements */
  }
}

Я могу сделать выше, но есть ли способ запустить тесты без явного определения ContextConfiguration?

Ответы [ 2 ]

3 голосов
/ 29 июня 2019

Попробуйте поместить свой класс Application (Annotated @SpringBootApplication) в пакет, являющийся корнем других пакетов. В вашем случае это io.example пакет.

1 голос
/ 30 июня 2019

@ piradian уже предоставил правильный ответ, я попытаюсь объяснить, почему он правильный.

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

В основном, для получения конфигурации необходимо выполнить два шага:

  • Найти приложение для весенней загрузки
  • Найти все конфигурации / компоненты, которые должны быть загружены

Для первого шага сначала пытается найти аннотацию @SpringBootConfiguration.Это метааннотация, размещенная в аннотации @SpringBootApplication.Это необходимо для поиска всех зарегистрированных компонентов / конфигураций.

Таким образом, он начинается с пакета, в котором находится тест (io.example.main), и если он находит класс с @SpringBootConfiguration в том же пакете (и да, он его находит) - тогда это означает, что этоБазовый пакет для поиска всех конфигураций / компонентов.Если он не находит такой класс, то он поднимается на один пакет вверх (io.example) и начинает поиск снова, а затем, если не найден, идет (io)

Когда класс найден,он начинает поиск конфигурации / компонентов вниз , начиная с пакета, в котором находится приложение.Именно так работает весеннее загрузочное приложение.И это является источником ошибки: пакет

io.example.main не имеет никаких «подпакетов», поэтому тест с весенней загрузкой ничего не находит, и поэтому тест не пройден.

Если выпереместите SpringBootApplication на один пакет вверх, это решит проблему.потому что теперь первый шаг описанного выше процесса ищет в пакете io.example.main, ничего не находит, ищет в io.example, находит требуемый класс, и именно здесь начинается второй шаг.

Теперь,если вы используете @SpringBootTest в сочетании с @ContextConfiguration, это все равно что сказать весенней загрузке: «Не активируйте этот двухфазный поиск, просто возьмите классы конфигурации, которые я предоставляю, и начните с этого».Вот почему это работает для вас с @ContextConfiguration

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...