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

Reactor单元测试:响应式改造后Mock验证问题求助

解决响应式Mono场景下的Mockito验证问题

你的核心问题出在两个地方:

  • 误把Mono实例当成了要验证的目标,真正需要验证的是Mono内部包裹的MyClass2 mock对象
  • 响应式流是惰性执行的,不订阅就不会触发内部逻辑,导致api1根本没被调用,自然会出现“无交互”错误

下面是具体的修正方案:

步骤1:拆分mock对象与Mono创建

先单独生成MyClass2的mock实例,再把它包装进Mono,避免混淆对象层级:

MyClass1 input = mock(MyClass1.class);
// 先创建真正要验证的mock实例
MyClass2 mockMyClass2 = mock(MyClass2.class);
// 再将mock实例包装为Mono
Mono<MyClass2> mockResult = Mono.just(mockMyClass2);

步骤2:正确配置mock行为

针对mockMyClass2(而非Mono)配置api1的行为:

// 配置mock对象的api1方法行为
doNothing().when(mockMyClass2).api1("testing");
// 配置input的api2返回目标Mono
when(input.api2(any())).thenReturn(mockResult);

步骤3:触发响应式流执行

必须订阅Mono才能触发内部逻辑,测试场景下可以用block()同步等待执行完成:

// 调用api2并触发流执行
input.api2(any()).block();

如果用Spring响应式测试框架,更推荐用StepVerifier优雅验证:

StepVerifier.create(input.api2(any()))
    .expectNext(mockMyClass2)
    .verifyComplete();

步骤4:验证真实mock对象的调用

最后验证input和mockMyClass2的方法调用,注意不要去验证Mono实例:

verify(input).api2(any());
// 验证的是真正的mock实例,不是Mono
verify(mockMyClass2).api1("testing");

完整修正后的测试代码

// 初始化mock对象
MyClass1 input = mock(MyClass1.class);
MyClass2 mockMyClass2 = mock(MyClass2.class);
Mono<MyClass2> mockResult = Mono.just(mockMyClass2);

// 配置mock行为
doNothing().when(mockMyClass2).api1("testing");
when(input.api2(any())).thenReturn(mockResult);

// 触发响应式流执行
input.api2(any()).block();

// 验证方法调用
verify(input).api2(any());
verify(mockMyClass2).api1("testing");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:57:06