Testcontainers是一个Java库,可轻松将Docker容器集成到JUnit测试中。 在Containerized World中 ,将测试配置与嵌入式数据库和服务复杂化几乎没有意义。 而是使用在Docker中运行您的服务,并让Testcontainers为您管理此服务。
在此博客文章中,您将学习如何在Spring Boot 2集成测试中配置Testcontainer以运行PostgreSQL,MySQL和MariaDB。
这篇博客文章涵盖:
- 使用PostgreSQL , MySQL和MariaDB进行Spring Boot 2测试的Testcontainers配置(通过JDBC URL Scheme )
- @DataJpaTest中的
@DataJpaTest
依存关系
为了使用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加载的脚本来初始化数据库。 可以直接从类路径或从任何位置加载文件。 唯一要做的就是更改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: ///?TC_INITSCRIPT=file:src/main/resources/init_db.sql : ///?TC_INITSCRIPT=file:src/main/resources/init_db.sql
要么
spring.datasource.url=jdbc:tc:postgresql: 9.6 : ///?TC_INITSCRIPT=classpath:init_db.sql spring.datasource.url=jdbc:tc:postgresql: ///?TC_INITSCRIPT=classpath:init_db.sql : ///?TC_INITSCRIPT=classpath:init_db.sql
@DataJpaTest
为了在@DataJpaTest
使用TC,您需要确保使用应用程序定义的(自动配置的)数据源。 您可以通过使用@AutoConfigureTestDatabase
注释测试来轻松完成此@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的Docker Compose for Spring Boot应用程序
翻译自: https://www.javacodegeeks.com/2020/04/spring-boot-tests-with-testcontainers-and-postgresql-mysql-or-mariadb.html