SpringBoot 整合 Testcontainers——数据库与中间件集成测试
单元测试可以 Mock 掉数据库,但集成测试需要真实环境。Testcontainers 在测试时启动 Docker 容器,用完后自动销毁。
一、引入依赖
<dependency><groupId>org.testcontainers</groupId><artifactId>testcontainers</artifactId><version>1.19.3</version><scope>test</scope></dependency><dependency><groupId>org.testcontainers</groupId><artifactId>mysql</artifactId><version>1.19.3</version><scope>test</scope></dependency>二、MySQL 集成测试
@SpringBootTest@TestcontainersclassUserRepositoryTest{@ContainerstaticMySQLContainer<?>mysql=newMySQLContainer<>("mysql:8.0").withDatabaseName("testdb").withUsername("test").withPassword("test");@DynamicPropertySourcestaticvoidconfigureProperties(DynamicPropertyRegistryregistry){registry.add("spring.datasource.url",mysql::getJdbcUrl);registry.add("spring.datasource.username",mysql::getUsername);registry.add("spring.datasource.password",mysql::getPassword);}@AutowiredprivateUserRepositoryuserRepository;@TestvoidtestSaveAndFind(){Useruser=newUser();user.setName("张三");user.setEmail("zhangsan@test.com");userRepository.save(user);assertThat(user.getId()).isNotNull();Userfound=userRepository.findById(user.getId()).orElse(null);assertThat(found).isNotNull();assertThat(found.getName()).isEqualTo("张三");}}三、Redis 集成测试
<dependency><groupId>org.testcontainers</groupId><artifactId>redis</artifactId><version>1.19.3</version><scope>test</scope></dependency>@SpringBootTest@TestcontainersclassRedisCacheTest{@ContainerstaticGenericContainer<?>redis=newGenericContainer<>(DockerImageName.parse("redis:7-alpine")).withExposedPorts(6379);@DynamicPropertySourcestaticvoidconfigureProperties(DynamicPropertyRegistryregistry){registry.add("spring.redis.host",redis::getHost);registry.add("spring.redis.port",()->redis.getMappedPort(6379));}@AutowiredprivateStringRedisTemplateredisTemplate;@TestvoidtestSetAndGet(){redisTemplate.opsForValue().set("test:key","hello");Stringvalue=redisTemplate.opsForValue().get("test:key");assertThat(value).isEqualTo("hello");}}四、共享容器
@TestcontainersabstractclassAbstractIntegrationTest{@ContainerstaticMySQLContainer<?>mysql=newMySQLContainer<>("mysql:8.0");@ContainerstaticGenericContainer<?>redis=newGenericContainer<>(DockerImageName.parse("redis:7-alpine")).withExposedPorts(6379);@DynamicPropertySourcestaticvoidconfigureProperties(DynamicPropertyRegistryregistry){registry.add("spring.datasource.url",mysql::getJdbcUrl);registry.add("spring.datasource.username",mysql::getUsername);registry.add("spring.datasource.password",mysql::getPassword);registry.add("spring.redis.host",redis::getHost);registry.add("spring.redis.port",()->redis.getMappedPort(6379));}}💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/MySQL 实战干货,不让你白来。
