Reactor单元测试:响应式改造后Mock验证问题求助
解决响应式Mono场景下的Mockito验证问题
你的核心问题出在两个地方:
- 误把Mono实例当成了要验证的目标,真正需要验证的是Mono内部包裹的
MyClass2mock对象 - 响应式流是惰性执行的,不订阅就不会触发内部逻辑,导致
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
相关产品推荐
相关产品推荐

