You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mockito测试Quarkus Reactive Panache服务时数据库连接失败求助

问题排查与解决方案

你的问题核心是:虽然用@InjectMock替代了UserRepository,但Quarkus测试环境仍尝试初始化PostgreSQL数据源,导致连接localhost:5432失败,最终接口返回500。

解决方案1:配置测试环境禁用数据源

在src/test/resources下创建application-test.yml,添加以下配置彻底禁用数据库相关初始化:

quarkus:
  datasource:
    db-kind: none  # 告知Quarkus无需初始化任何数据源
  hibernate-orm:
    active: false  # 禁用Hibernate ORM,避免不必要的初始化

Quarkus在测试时会自动加载application-test.yml,这样就不会尝试连接真实数据库了。

解决方案2:确认Mock的正确性

  • 确保UserRepository是CDI管理的Bean(比如标注了@ApplicationScoped),@InjectMock只能替换CDI托管的Bean。
  • 检查Mockito的Stub逻辑是否覆盖了业务所需的所有方法:
    when(userRepository.persist(any(User.class)))
            .thenReturn(Uni.createFrom().item(new User()));
    
    如果业务逻辑中还调用了UserRepository的其他方法(比如findByEmail),需要同步Stub这些方法的返回值。

解决方案3:排除数据库相关扩展(可选)

如果上述配置仍不生效,可以在测试类上添加扩展排除,强制禁用数据库相关扩展:

@QuarkusTest
@DisplayName("UserControllerTest - Integration Test")
@DisableQuarkusExtension({ReactivePostgresqlDriver.class, HibernateOrmReactiveExtension.class})
class UserControllerTest {
    // ... 测试代码
}

注意需要导入对应的扩展类,根据你使用的数据库驱动调整。

验证步骤

  1. 启动测试前确认本地没有运行PostgreSQL服务(避免干扰)。
  2. 运行测试,检查是否还出现数据库连接拒绝的错误。
  3. 如果仍有问题,查看测试日志中是否有其他Bean触发了数据库连接,针对性Mock相关依赖。

内容的提问来源于stack exchange,提问作者Clever Salvador

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:58:26