当前位置: 首页 > news >正文

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 实战干货,不让你白来。

http://www.cnnetsun.cn/news/3739565.html

相关文章:

  • Burpsuite实战:破解Token防护的暴力破解攻防演练
  • 第3讲|Prompt 工程与 API 调用:AI 产品经理的第一个核心实操能力
  • 2026年降AI率工具测评:20款实测,只有这几个真有免费试用
  • 2026 年电钢琴选购指南:避坑参数解析与十款高性价比机型实测
  • OpenVINO加速Qwen3-TTS:本地化语音合成优化方案
  • UVC摄像头
  • 大模型时代的数据库范式转移:从SQL到自然语言交互的技术演进
  • Mybatis-Plus15: 悲观锁 乐观锁
  • 异构系统对接的虚拟层架构:本体语义如何架在现有系统之上
  • 5大智能模块:重新定义你的《明日方舟》游戏体验
  • 如何在Mac上实现Windows风格的高效窗口切换:alt-tab-macos触控板手势完全指南
  • AI骨骼绑定技术突破:UniRig如何将3D角色动画效率提升10倍
  • 5分钟高效配置:VisualCppRedist AIO运行库一键部署终极方案
  • 如何彻底解决Windows多显示器DPI缩放不一致问题:SetDPI终极指南
  • 小白程序员必看:收藏!如何避免被AI大模型供应商“套牢”?
  • 字段定义冲突,异构系统对接最隐蔽的坑
  • Python爬虫环境配不对?数据再多也是白搭
  • 【AI服装更换技术实战指南】:2024年最精准、最低成本的5步换装工作流(附开源模型对比数据)
  • 面试官:说说你做的 Paimon 流批一体项目,有哪些亮点?
  • 免费降AI率工具红黑榜:2026年实测20款,虚假宣传曝光
  • XState状态机终极指南:如何用可视化思维构建可靠应用
  • Yuzu模拟器终极优化指南:三步解决卡顿闪退问题
  • 【独家首发】AI季节变换提示词工程白皮书:217组经实测验证的季节-天气-时段组合词库(限前500名领取)
  • 【单片机课设毕设项目】基于 STM32 的多传感器数据处理与智能预警系统设计 基于 STM32 的室内空气安全监测与通风装置开发(010801)
  • 【单片机课设毕设项目】基于 51 单片机的 LCD 显示智能窗帘环境监测系统设计 基于单片机舵机驱动的智能窗帘与风扇联动控制设计(011501)
  • 优惠券省钱 app 和返利 app 是同一类产品吗?模式对比
  • AiPrice和AliPrice是什么关系:是否属于阿里巴巴集团?
  • 5分钟掌握Apache APISIX Dashboard:可视化API网关管理终极指南 [特殊字符]
  • Siglec: 糖蛋白受体家族的免疫调节作用
  • BetterNCM安装器:网易云音乐插件一键自动化部署方案