Репозиторий Autowired имеет значение null в моем классе @SpringBootTest

#spring-boot #junit #java-11 #spring-test

Вопрос:

Я пытаюсь проверить свою конечную точку ПОЛУЧЕНИЯ. Для этого мне нужно загрузить некоторые данные в мою базу данных в памяти H2. У меня есть следующий тестовый класс:

 @ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserApiControllerIntegrationTest {

    @Autowired
    private ExerciseRepository myRepository;

    ...

    @Before
    public void initializeDatabase() {
        ...
    }
}
 

Внутри initializeDatabase() метода я создал несколько объектов и использую метод репозитория .saveAndFlush() , чтобы сохранить их в своей базе данных.

Когда я пытаюсь запустить этот тестовый класс, у меня возникает следующая ошибка:

java.lang.Исключение NullPointerException: Не удается вызвать «….MyRepository.saveAndFlush(объект)», потому что «this.MyRepository» равно нулю

Я видел несколько сообщений с теми же ошибками, но без правильного ответа. Я тоже попытался поставить @DataJpaTest , но ничего не получилось. Я также попытался добавить @RunWith(SpringRunner.class) аннотацию, но появилась еще одна ошибка:

java.lang.Исключение IllegalStateException: Ошибка конфигурации: найдено несколько объявлений @BootstrapWith для тестового класса [com.egym.recruiting.codingtask.api.RankingApiControllerIntegrationTest]: [@org.springframework.test.context.BootstrapWith(value=org.springframework.boot.test.context.SpringBootTestContextBootstrapper), @org.springframework.test.context.BootstrapWith(value=org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTestContextBootstrapper)]

Обновить

Это мое заявление.класс java:

 @SpringBootApplication
@ComponentScan(basePackages = { "...", "....api",
        "....config" })
public class Application implements CommandLineRunner {

    public static void main(String[] args) {
        new SpringApplication(Application.class).run(args);
    }

    ...
}
 

В моем каталоге конфигурации у меня есть:

  • Класс OpenAPIDOcumentationConfig, в котором я включаю swagger2
  • Класс HomeController используется для перенаправления на документацию api OpenAPI

Я не думаю, что это повлияет на мою ошибку.

Комментарии:

1. Можете ли вы опубликовать свой основной весенний урок?.. его аннотации и конфигурация также повлияют на настройку весеннего теста.

2. Я обновлю как можно скорее

Ответ №1:

Мы можем создать экземпляр компонента myrepository в тестовом классе, чтобы подключить зависимость.

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

Комментарии:

1. Не могли бы вы уточнить или предоставить какой-нибудь код/документацию?

Ответ №2:

Spring anotation @SpringBootTest будет сканировать только компоненты, которые были объявлены в вашем каталоге файлов (и в подкаталогах). Для сканирования дополнительных компонентов вам необходимо предоставить каталоги с аннотацией @ComponentScan так же, как вы это делали в своем классе SpringBootApplication

Добавить файл конфигурации теста:

 @Configuration
@ComponentScan(basePackages = { "...", "....api",
    "....config" })
public class TestConfig {
}
 

Свяжите файл конфигурации теста с вашим тестовым классом:

 @ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT, 
                classes= TestConfig.class)
public class UserApiControllerIntegrationTest {

    @Autowired
    private ExerciseRepository myRepository;

    ...

    @Before
    public void initializeDatabase() {
        ...
    }
}
 

Комментарии:

1. Привет, Кшиштоф К., спасибо за ваш ответ. Я создал новый класс TestConfig , равный вашему (конечно, я заменил тот ... , который я спрятал. Кроме того, я добавил параметр classes в @SpringBootTest аннотацию. Но ничего не изменилось. Однако я подтверждаю, что мой тестовый класс находится в тестовой директории, которая не содержит компонентов.