Как встроить в память MariaDB4j для замены стандартного источника данных Spring в JUnit Tests? - PullRequest
0 голосов
/ 06 февраля 2019

Я пишу тесты для Service, которые используют несколько хранилищ данных Jpa.Проблема заключается в том, что некоторые репозитории используют множество собственных запросов со MySQL специальными функциями, такими как str_to_date().Поэтому, когда я попытался протестировать метод сервиса, используя H2, я получил сообщение о том, что H2 не распознает функцию.Я пытался использовать H2 в режиме MySQL, но получил ту же ошибку.

здесь mariaDB4j был предложен в качестве обходного пути.Я добавил зависимость в Maven

<dependency>
    <groupId>ch.vorburger.mariaDB4j</groupId>
    <artifactId>mariaDB4j</artifactId>
    <version>2.3.0</version>
    <scope>test</scope>
</dependency>

Но получаю IllegalStateException : Failed to replace DataSource with an embedded database for tests. If you want an embedded database please put a supported one on the classpath or tune the replace attribute of @AutoConfigureTestDatabase.

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

@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.ANY)
public class TestPay {

    @TestConfiguration
    static class PaymentServiceTestContextConfiguration {
        @Bean
        public PaymentService paymentService(){
            return new PaymentService();
        }
    }

    @Autowired
    private PaymentService paymentService;
    @Autowired
    private TarifRepository firstRepository;
    @Autowired
    private BuildingRepository secondRepository;
    @Autowired
    private ApartmentRepository thirdRepository;

    /* Test cases here*/
}

Проект построен с использованием аннотацийВесенний ботинок.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Я создаю следующий класс, который я повторно использую в каждом интеграционном тесте, который требует доступа к базе данных mariadb.Возможно, его можно улучшить (и я был бы рад за предложения), но пока работает:

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(locations="classpath:application-junit.properties")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) //otherwise mariadb is not cleaned up between tests
public abstract class MyIntegrationTest {

    private static MariaDB4jSpringService DB;

    @BeforeClass
    public static void init() throws ManagedProcessException {
        DB = new MariaDB4jSpringService();
        DB.setDefaultPort(1234);
        DB.start();
        DB.getDB().createDB("yourtables");
        DB.getDB().source("schema.sql"); // init scripts from /src/test/resources/schema.sql
    }

    @AfterClass
    public static void cleanup() {
        if (DB != null) DB.stop();
    }
}

application-junit.properties:

spring.datasource.url=jdbc:mariadb://localhost:1234/yourtables
spring.datasource.username=root
spring.datasource.password=
0 голосов
/ 06 февраля 2019

Похоже, вам нужно явно объявить свой DataSource для тестов.В случае h2, вероятно, уже есть компонент источника данных, объявленный зависимостью весеннего теста, но может не быть готового компонента, предоставляемого ch.vorburger.mariaDB4j.

Вот пример встроенногоИсточник данных MariaDB, который я украл из в другом месте в Интернете

import ch.vorburger.mariadb4j.DBConfigurationBuilder
import ch.vorburger.mariadb4j.springframework.MariaDB4jSpringService
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Profile

import javax.sql.DataSource

@Configuration
@Profile(['local', 'integrationTest'])
class EmbeddedMariaDbConfig {

    @Bean
    MariaDB4jSpringService mariaDB4jSpringService() {
        new MariaDB4jSpringService()
    }

    @Bean
    DataSource dataSource(MariaDB4jSpringService mariaDB4jSpringService,
                          @Value('${app.mariaDB4j.databaseName}') String databaseName,
                          @Value('${spring.datasource.username}') String datasourceUsername,
                          @Value('${spring.datasource.password}') String datasourcePassword,
                          @Value('${spring.datasource.driver-class-name}') String datasourceDriver) {
        //Create our database with default root user and no password
        mariaDB4jSpringService.getDB().createDB(databaseName)

        DBConfigurationBuilder config = mariaDB4jSpringService.getConfiguration()

        DataSourceBuilder
                .create()
                .username(datasourceUsername)
                .password(datasourcePassword)
                .url(config.getURL(databaseName))
                .driverClassName(datasourceDriver)
                .build();
    }
}
...