Контекст приложения не загружается, так как он не находит ни одного подходящего компонента типа EntityManager

#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