Отказ от автоматического подключения Spring Data JPA во время тестов

У меня есть приложение Spring Boot, которое использует библиотеку (мою собственную), которая имеет зависимости Spring Data JPA. В библиотеке я использую интерфейсы репозитория JPA и пользовательский фрагмент репозитория, который использует интерфейс JpaSpecificationExecutor.

У меня есть конфигурация внутри библиотеки для @EnableJpaRepositories, как показано ниже:

@EnableJpaRepositories(basePackages = "my.package.domain.jpa.repo", bootstrapMode= BootstrapMode.LAZY)
@EntityScan(basePackageClasses = {LookupConfig.class, LookupMapping.class})
@Configuration
public class LookupJpaConfiguration {}

Я также объявил (не создал) метамодели (с добавлением _ к имени класса) для классов сущностей в том же пакете, что и классы сущностей.

Основное приложение также является @SpringBootApplication с spring-boot-starter-parent:2.1.0 в качестве родителя. Это приложение использует библиотеку в качестве зависимости и @Autowire класс из библиотеки. Само приложение не имеет прямых зависимостей от Spring Data.

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

Вот как выглядит объявление тестового класса:

@ExtendWith({SpringExtension.class, MockitoExtension.class})
public class OrderStatusProcessorTest {

    // Uses the library with JPA dependency
    @MockBean private LookupService lookupService;

    // The class being tested; uses LookupService
    private final OrderStatusProcessor orderStatusProcessor;

    public OrderStatusProcessorTest() {
        orderStatusProcessor = new OrderStatusProcessor(lookupService);

    }
...

Я уже пробовал @Mocking DataSource и EntityManagerFactory, но ни один из них не сработал.

pom-файл библиотеки

<properties>
    <spring-data-releasetrain.version>Lovelace-SR5</spring-data-releasetrain.version>
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

При текущей настройке ошибка, которую я вижу, выглядит следующим образом:

java.lang.IllegalStateException: Failed to load ApplicationContext

    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
    ...

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unsatisfied dependency expressed through method 'entityManagerFactory' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactoryBuilder' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unsatisfied dependency expressed through method 'entityManagerFactoryBuilder' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaVendorAdapter' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method 'jpaVendorAdapter' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class

Это работает, если я правильно указываю свойства источника данных. Но я хочу, чтобы тесты выполнялись без фактического подключения к базе данных.

Дайте мне знать, если мне нужно предоставить дополнительную информацию. Заранее спасибо!

То, что вы пытаетесь сделать, называется интеграционный тест. Истинный модульный тест не зависит от аннотации @SpringBootTest к классу или @Autowired от тестового класса. Так что это объясняет, почему тест запрашивает конфигурацию базы данных.

Dherik 01.03.2019 18:34

@Dherik Это имеет смысл. Однако я удалил аннотации @SpringBootTest, @EnableAutoConfiguration и @Autowired, но проблема осталась. Ошибка точно такая же.

shyam 03.03.2019 08:33

Попробуйте исключить все автоконфигурации источника данных из загрузки Spring — например. @TestPropertySource(properties= {"spring.autoconfigure.exclude = {org.springframework.boot.aut‌​oconfigure.jdbc.Data‌SourceAutoConfigurat‌​ion.class, org.springframework.boot.autoconfigure.jdbc.DataSourceTransa‌​ctionManagerAutoConfig‌​iguration. class, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaA‌​utoConfiguration.cla‌​ss})}) @SpringBootTest общедоступный класс OrderStatusProcessorTest{...} — Дайте мне знать, если это сработает для вас

hovanessyan 03.03.2019 13:09
0
3
591
0

Другие вопросы по теме