@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
相关产品推荐
相关产品推荐

