#spring #spring-boot #spring-data-jpa #spring-test
#spring #spring-boot #spring-data-jpa #spring-test
Вопрос:
При запуске JUnits ApplicationContext не загружается, поскольку он не смог найти соответствующий компонент javax.persistence.EntityManager. Однако приложение, для которого пишется Junit, работает. И приложение, и JUnits используют одну и ту же конфигурацию spring.
Мой класс конфигурации выглядит следующим образом
@Configuration
@EnableTransactionManagement
public class AppConfiguration {
@Autowired private EntityManager entityManager;
@Override @Bean
public CustomRepository<Person> customRepository(){
return new CustomRepository<>(Person.class, entityManager);
}
Как вы видите, я могу автоматически подключить EntityManager, хотя я явно не определил компонент, и приложение работает без каких-либо проблем.
Теперь в моем JUnit
@RunWith(SpringRunner.class)
@ContextConfiguration(classes=AppConfiguration.class)
@TestPropertySource(locations = "classpath:application.properties")
public class ControllerTest {
@Autowired
private CController controller;
Как вы видите, и приложение, и мой Junit используют одну и ту же конфигурацию. Как всегда, при запуске JUnit я вижу
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManager' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Я не мог понять, что в JUnit вызывает isssue, в то время как приложение все еще работает.
Спасибо
Комментарии:
1. можете ли вы поделиться своим pom.xml ?
2. Как это связано с Spring Data JPA? Вы не должны вводить / передавать
EntityManager
подобное. Вместо этого в вашемCustomRepository
аннотируйтеEntityManager
поле,@PersistenceContext
чтобы позволить Spring выполнять тяжелую работу. Кроме того, если вы используете Spring Data, вам не нужна пользовательская реализация репозитория. Удалите@TestPropertySource
, поскольку Spring Boot автоматически загружает его, и для тестирования убедитесь, что доступна база данных (например, в памяти или на основе docker).
Ответ №1:
это явно означает, что EntityManager
компонент не определен в контексте вашего приложения. Поэтому либо вы определяете его самостоятельно, либо позволяете Spring-boot выполнить подъем (Spring-boot автоматически настраивает ваш контекст на основе зависимостей в вашем POM-файле). Если вы выберете последний вариант, то один из вариантов избавления от ошибки путем добавления H2 DB.
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
Обновить:
В вашем тесте вместо инициализации вашего контекста с помощью @ContextConfiguration
do that with @SpringBootTest
он загрузит весь ваш контейнер (включая другие компоненты, которые не определены в AppConfiguration.java
). Подробнее об этом читайте в spring-docs
Комментарии:
1. Спасибо за ваши предложения. Я попробую внедрить Entity manager непосредственно в CustomRepository с помощью @PersistenceContext. Но я не понимаю, как эта настройка работает при запуске приложения Spring boot, но сбой происходит только в JUnit