Testcontainers是一个Java库,允许在JUnit测验中轻松集成Docker容器。在一个容器化的国际里,用嵌入式数据库和服务使测验装备复杂化是没有意义的。相反,运用在Docker中运行你的服务,让Testcontainers为你管理这些。
在这篇博文中,你将学习如何装备Testcontainers,在Spring Boot 2集成测验中运行PostgreSQL、MySQL和MariaDB。
这篇博文包含:
- Testcontainers的装备(经过JDBC URL Scheme),用于Spring Boot 2测验的PostgreSQL、MySQL和MariaDB。
- 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>
其间DATABASE
是postgresql
,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