Mockito中触发某Mock方法调用时如何调用另一Mock对象的方法
测试实现方案
完全可以通过Mockito实现你要的效果,不需要部署真实Kafka组件,核心是用doAnswer拦截kafka.send的调用,在拦截逻辑中手动触发B类的监听方法即可。
实现逻辑
- 测试时将A类依赖的Kafka客户端Mock掉,替换真实的Kafka收发逻辑
- 对Mock的Kafka客户端
send方法打桩:调用该方法时,不执行真实网络请求,直接取出传入的主题、消息参数,校验主题匹配MyTopic后,将消息内容直接传给B类的methodB执行 - 执行
methodA后,即可完整验证从取数、数据处理到下游消费的全链路逻辑,全程无外部组件依赖
参考测试代码
@ExtendWith(MockitoExtension.class) public class FullBizFlowTest { @InjectMocks private A a; // 待测试的A类实例,自动注入Mock的依赖 @Mock private KafkaProducer kafka; // Mock掉Kafka生产者,跳过真实发送 private B b = new B(); // B类可使用真实实例,也可用@Mock/@Spy做行为验证 @Test void testFlowWithoutRealKafka() { // 拦截kafka.send调用,直接转发给消费逻辑 doAnswer(invocation -> { String inputTopic = invocation.getArgument(0); String message = invocation.getArgument(1); // 校验发送目标主题符合预期 assertEquals("MyTopic", inputTopic); // 直接触发消费方法,绕过Kafka broker b.methodB(message); return null; // 若send方法有返回值(比如异步SendResult),返回Mock对象即可 }).when(kafka).send(anyString(), anyString()); // 此处可补充数据库依赖的Mock打桩,返回你预设的测试数据 // ... // 执行A类业务方法 a.methodA(); // 后续做全链路断言:比如验证B类处理结果、数据加工逻辑是否符合预期 // 如果B是Mock/Spy实例,可直接verify消费逻辑是否被正确调用、入参是否符合预期 } }
补充说明
如果你的kafka.send是异步逻辑,这种打桩方式会在调用send的线程里同步执行methodB,不需要处理异步线程等待、测试环境不稳定的问题,单测执行速度和普通单元测试一致。如果需要做更严格的校验,还可以在拦截逻辑里判断消息内容是否和加工后的预期值一致,提前发现数据处理环节的问题。
内容的提问来源于stack exchange,提问作者Getsby
相关产品推荐
相关产品推荐

