Как я могу создать новую базу данных с MariaDB4j перед выполнением интеграционного теста Spring Boot? - PullRequest
0 голосов
/ 23 апреля 2020

Я застрял. Мне нужна помощь в настройке простой тестовой демонстрации интеграции с MariaDB4j.

Что у меня сейчас : простое демонстрационное приложение с весенней загрузкой с REST API, сервисом и слоем БД. Слой БД использует JPA, и приложение может подключаться к Postgres или MariaDB. Существует одна таблица БД, управляемая Flyway. Это действительно просто.

Цель: Я хочу написать интеграционные тесты для сервисного уровня, используя встроенные Postgres и MariaDB. Часть Postgres выполнена, но у меня есть проблема с MariaDB. Я выбрал MariaDB4j, потому что он поддерживает Spring Boot (https://github.com/vorburger/MariaDB4j#how -spring )

Моя проблема: По умолчанию MariaDB4j подключается к тестовой базе данных, но мне нужна 'demo' база данных, потому что класс Person имеет аннотацию @Table(schema = "demo", name = "person"). Я решил создать демонстрационную базу данных сразу после того, как MariaDB4jSpringService запустил MariaDB. Я написал и внутренний класс конфигурации, который переопределяет MariaDB4jSpringService bean и создает базу данных.

@SpringBootTest
@TestPropertySource(properties = {
        "spring.datasource.password=",
        "spring.datasource.url=jdbc:mariadb://localhost:3718/demo",
        "mariaDB4j.port=3718"
})
@ActiveProfiles(profiles = {"mariadb"})
public class DemoApplicationMariaDBTests {
    @Configuration
    @Primary
    public static class TestConfig2 {
        @Bean
        public MariaDB4jSpringService mariaDB4jSpringService() {
            MariaDB4jSpringService service = new MariaDB4jSpringService() {
                @Override
                public void start() {
                    super.start();
                    try {
                        this.getDB().createDB("demo");
                    } catch (ManagedProcessException e) {
                        e.printStackTrace();
                    }
                }
            };
            return service;
        }
    }

    @Autowired
    DemoService service;

    @Test
    void serviceTest() {
        service.getNames().names.forEach(System.out::println);
    }
}

Он делает то, что я хочу ch.vorburger.mariadb4j.DB: Successfully ran the command: create database if not exists 'demo', но я получаю следующее исключение:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'hu.spring.myapp.DemoApplicationMariaDBTests': Unsatisfied dependency expressed through field 'service'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hu.spring.myapp.service.DemoService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Я попытался определить класс конфигурации как класс верхнего уровня и использовать @Import(TestConfig.class)

TestConfig. java

@Configuration
public class TestConfig {
    @Bean
    @Primary
    public MariaDB4jSpringService mariaDB4jSpringService() {
        MariaDB4jSpringService service = new MariaDB4jSpringService() {
            @Override
            public void start() {
                super.start();
                try {
                    this.getDB().createDB("demo");
                } catch (ManagedProcessException e) {
                    e.printStackTrace();
                }
            }
        };
        return service;
    }
}

DemoApplicationMariaDBTests. java

@SpringBootTest
@Import(TestConfig.class)
@TestPropertySource(properties = {
        "spring.datasource.password=",
        "spring.datasource.url=jdbc:mariadb://localhost:3718/demo",
        "mariaDB4j.port=3718"
})
@ActiveProfiles(profiles = {"mariadb"})
public class DemoApplicationMariaDBTests {
    @Autowired
    DemoService service;

    @Test
    void serviceTest() {
        service.getNames().names.forEach(System.out::println);
    }
}

Эта версия, я не знаю почему, не выполняет TestConfig и не создает базу данных 'demo'. Выполнение не удалось при инициализации Flyway:

java.sql.SQLSyntaxErrorException: Could not connect to address=(host=localhost)(port=3718)(type=master) : Unknown database 'demo'

Я попытался заменить @Import на @ContextConfiguration (classes = TestConfig.class), но это не помогло.

@SpringBootTest
@ContextConfiguration(TestConfig.class)
@TestPropertySource(properties = {
        "spring.datasource.password=",
        "spring.datasource.url=jdbc:mariadb://localhost:3718/demo",
        "mariaDB4j.port=3718"
})
@ActiveProfiles(profiles = {"mariadb"})
public class DemoApplicationMariaDBTests {
    @Autowired
    DemoService service;

    @Test
    void serviceTest() {
        service.getNames().names.forEach(System.out::println);
    }
}

Эта версия создает базу данных, но не инициализирует приложение вообще. Сообщение об ошибке:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hu.spring.myapp.service.DemoService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

Как мне решить эту проблему?

Полный источник демонстрационного приложения можно найти здесь: https://drive.google.com/open?id=17J7I1Lxnk8C0X7Qx4uMWVSEdpy5iGpIz

...