Не удается загрузить прикладной контекст, так как он не находит подходящий компонент типа EntityManager - PullRequest
0 голосов
/ 19 апреля 2019

Во время работы JUnits ApplicationContext не загружается, так как ему не удалось найти соответствующий компонент Javax.persistence.EntityManager. Однако приложение, для которого пишется Junit, работает. И приложение, и JUnits используют одинаковую конфигурацию пружины.

Мой класс конфигурации выглядит следующим образом

@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 вызывает проблему, пока приложение все еще работает.

Спасибо

1 Ответ

0 голосов
/ 19 апреля 2019

это ясно означает, что bean-компонент EntityManager не определен в контексте вашего приложения.Так что либо вы определяете это сами, либо позволяете Spring-boot делать подъем (Spring-boot автоматически настраивает ваш контекст на основе зависимостей в вашем POM-файле).Если вы выберете последний вариант, то один вариант, чтобы избавиться от ошибки, добавив H2 DB.

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>

ОБНОВЛЕНИЕ: В вашем тесте вместо инициализации контекста с помощью @ContextConfiguration сделайте это с @SpringBootTestон загрузит весь ваш контейнер (включая другие bean-компоненты, которые не определены в AppConfiguration.java).Подробнее о spring-docs

...