SpringBoot 整合 Testcontainers——数据库与中间件集成测试
单元测试可以 Mock 掉数据库但集成测试需要真实环境。Testcontainers 在测试时启动 Docker 容器用完后自动销毁。一、引入依赖dependencygroupIdorg.testcontainers/groupIdartifactIdtestcontainers/artifactIdversion1.19.3/versionscopetest/scope/dependencydependencygroupIdorg.testcontainers/groupIdartifactIdmysql/artifactIdversion1.19.3/versionscopetest/scope/dependency二、MySQL 集成测试SpringBootTestTestcontainersclassUserRepositoryTest{ContainerstaticMySQLContainer?mysqlnewMySQLContainer(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(){UserusernewUser();user.setName(张三);user.setEmail(zhangsantest.com);userRepository.save(user);assertThat(user.getId()).isNotNull();UserfounduserRepository.findById(user.getId()).orElse(null);assertThat(found).isNotNull();assertThat(found.getName()).isEqualTo(张三);}}三、Redis 集成测试dependencygroupIdorg.testcontainers/groupIdartifactIdredis/artifactIdversion1.19.3/versionscopetest/scope/dependencySpringBootTestTestcontainersclassRedisCacheTest{ContainerstaticGenericContainer?redisnewGenericContainer(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);StringvalueredisTemplate.opsForValue().get(test:key);assertThat(value).isEqualTo(hello);}}四、共享容器TestcontainersabstractclassAbstractIntegrationTest{ContainerstaticMySQLContainer?mysqlnewMySQLContainer(mysql:8.0);ContainerstaticGenericContainer?redisnewGenericContainer(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 实战干货不让你白来。