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

@InjectMock(deepMock=true)弃用修复:Quarkus升级后JUnit测试替代方案

替代Quarkus @DeepMock的解决方案

核心原理

Quarkus的@DeepMock是对Mockito**深度存根(Deep Stubs)**功能的封装,升级后直接改用Mockito原生实现即可。

1. 注解替换

将原有的@DeepMock替换为Mockito的@Mock注解,并指定answer = Answers.RETURNS_DEEP_STUBS参数:

旧代码(Quarkus旧版)

@DeepMock
private UserService userService;

新代码

import org.mockito.Answers;
import org.mockito.Mock;

@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private UserService userService;

2. 编程式创建模拟对象

如果是手动创建模拟实例,直接在mock()方法中传入深度存根策略:

UserService userService = Mockito.mock(UserService.class, Answers.RETURNS_DEEP_STUBS);

3. 修复测试失败的关键

移除@DeepMock后测试失败,通常是因为原来依赖自动生成的嵌套模拟对象,现在需要明确定义预期行为:

// 示例:链式调用的返回值需要手动指定
when(userService.getProfile().getAddress().getCity()).thenReturn("New York");

4. 必要的测试类配置

确保测试类上添加Mockito的扩展注解,让注解生效:

  • JUnit 5:@ExtendWith(MockitoExtension.class)
  • JUnit 4:@RunWith(MockitoJUnitRunner.class)
  • Quarkus测试:配合@QuarkusTest使用时,确保quarkus-mockito扩展版本与当前Quarkus版本一致

注意事项

  • 深度模拟仅适用于简单链式调用场景,过度使用会降低测试可读性,建议仅在必要时使用
  • 避免依赖深度模拟的默认返回值(如null、空集合等),尽量明确指定每个关键调用的返回结果

内容的提问来源于stack exchange,提问作者Jack Daniels

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:21:06