#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
аннотацию. Но ничего не изменилось. Однако я подтверждаю, что мой тестовый класс находится в тестовой директории, которая не содержит компонентов.