Я застрял. Мне нужна помощь в настройке простой тестовой демонстрации интеграции с 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