Testcontainers是一个Java库,允许在JUnit测验中轻松集成Docker容器。在一个容器化的国际里,用嵌入式数据库和服务使测验装备复杂化是没有意义的。相反,运用在Docker中运行你的服务,让Testcontainers为你管理这些。

在这篇博文中,你将学习如何装备Testcontainers,在Spring Boot 2集成测验中运行PostgreSQL、MySQL和MariaDB。

这篇博文包含:

  • Testcontainers的装备(经过JDBC URL Scheme),用于Spring Boot 2测验的PostgreSQLMySQLMariaDB
  • Testcontainers在@DataJpaTest

目录

  • 依靠联系
  • 测验数据源装备

    • PostgreSQL的装备。
    • MySQL的装备。
    • MariaDB的装备。
  • 运用Testcontainers初始化测验数据库
  • @DataJpaTest
  • @SpringBootTest
  • 摘要
  • 源代码
  • 参见

依靠联系

为了运用Testcontainers,在pom.xml (假设是基于Maven的项目)中增加以下依靠项:

<properties>
    <org.testcontainers.version>1.12.5</org.testcontainers.version>
</properties>
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers</artifactId>
    <version>${org.testcontainers.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>DATABASE</artifactId>
    <version>${org.testcontainers.version}</version>
    <scope>test</scope>
</dependency>

其间DATABASEpostgresql,mysql,mariadb 中的一个:

留意:Testcontainers供给了JUnit 5 (Jupiter)插件,但在本文介绍的场景中不需要该插件。

测验数据源装备

为Spring Boot测验装备Testcontainers的步骤:

  • 将驱动程序设置为org.testcontainers.jdbc.ContainerDatabaseDriver ,这是一个Testcontainers JDBC署理驱动程序。这个驱动使将担任在数据源初始化时发动所需的Docker容器。
  • 将方言明确设置为你的数据库的方言完成,不然你在发动应用程序时就会出现异常。当你在你的应用程序中运用JPA(经过Spring Data JPA)时,这一步是必须的
  • 将JDBC URL设置为jdbc:tc:<database-image>:<version>:/// ,以便Testcontainers知道要运用哪个数据库镜像

PostgreSQL的装备

完好的装备:

spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver
spring.datasource.url=jdbc:tc:postgresql:9.6:///
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect

MySQL的装备

spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver
spring.datasource.url=jdbc:tc:mysql:8:///
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect

MariaDB的装备

spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver
spring.datasource.url=jdbc:tc:mariadb:10.3:///
spring.jpa.database-platform=org.hibernate.dialect.MariaDB103Dialect

更多关于数据库装备的信息请看这里的官方文档: https://www.testcontainers.org/modules/databases/

用Testcontainers初始化测验数据库

你能够用Testcontainers加载的脚本来初始化数据库。该文件能够直接从classpath加载,也能够从任何位置加载。唯一要做的就是改变JDBC的URL:

spring.datasource.url=jdbc:tc:postgresql:9.6:///?TC_INITSCRIPT=file:src/main/resources/init_db.sql

spring.datasource.url=jdbc:tc:postgresql:9.6:///?TC_INITSCRIPT=classpath:init_db.sql

@DataJpaTest

为了在@DataJpaTest 中运用TC,你需要保证运用应用程序定义的(主动装备的)数据源。你能够经过用@AutoConfigureTestDatabase 注释你的测验来轻松做到这一点,如下所示:

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class OwnerRepositoryTests {
    @Autowired
    private OwnerRepository ownerRepository;
    @Test
    void findAllReturnsJohnDoe() { // as defined in tc-initscript.sql
        var owners = ownerRepository.findAll();
        assertThat(owners.size()).isOne();
        assertThat(owners.get(0).getFirstName()).isEqualTo("John");
        assertThat(owners.get(0).getLastName()).isEqualTo("Doe");
    }
}

@SpringBootTest

@SpringBootTest 将运用应用程序定义的数据源,所以不需要额定的修正:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class OwnerResourceTests {
    @Autowired
    WebApplicationContext wac;
    @Test
    void findAllReturnsJohnDoe() throws Exception {
        given()
                .webAppContextSetup(wac)
        .when()
                .get("/owners")
        .then()
                .status(HttpStatus.OK)
                .body(
                        "_embedded.owners.firstName", containsInAnyOrder("John"),
                        "_embedded.owners.lastName", containsInAnyOrder("Doe")
                );
    }
}

总结

你刚刚学会了在Spring Boot集成测验中用Testcontainers装备PostgreSQL、MySQL和MariaDB的最简略方法。这个解决方案很适合于适当简略的设置。假如你需要对Docker镜像有更多的操控,请参阅Testcontainers官方文档。

源代码

本文的源代码能够在Github上找到:https://github.com/kolorobot/spring-boot-tc

另见

  • 用JUnit 5测验Spring Boot
  • 运用PostgreSQL的Spring Boot应用程序的Docker Compose