使用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 { // ... 测试代码 }
注意需要导入对应的扩展类,根据你使用的数据库驱动调整。
验证步骤
- 启动测试前确认本地没有运行PostgreSQL服务(避免干扰)。
- 运行测试,检查是否还出现数据库连接拒绝的错误。
- 如果仍有问题,查看测试日志中是否有其他Bean触发了数据库连接,针对性Mock相关依赖。
内容的提问来源于stack exchange,提问作者Clever Salvador
相关产品推荐
相关产品推荐

