Mockito中泛型与ArgumentCaptor问题:捕获Consumer<String>参数
Mockito捕获Consumer参数的正确写法
你遇到的问题是因为Java泛型的类型擦除:编译后Consumer<String>的泛型信息会被抹掉,只剩原始类型Consumer,所以Consumer<String>.class这种写法本身就是非法的,自然编译不通过。
下面是两种正确的实现方式:
方式一:基于原始类型创建捕获器
直接指定泛型类型,同时给forClass传入原始的Consumer.class:
// 声明捕获器时指定泛型为Consumer<String>,forClass传入原始类型 ArgumentCaptor<Consumer<String>> captor = ArgumentCaptor.forClass(Consumer.class); // 验证目标方法调用并捕获参数 verify(你的Mock对象).目标方法(captor.capture()); // 获取捕获到的Consumer<String>实例 Consumer<String> capturedConsumer = captor.getValue(); // 测试这个Consumer的行为,比如传入测试字符串触发逻辑 capturedConsumer.accept("测试用字符串"); // 后续可以验证Consumer内部的逻辑是否正确执行,比如验证某个依赖方法是否被调用
方式二:利用Java 8+类型推断简化写法
使用Mockito提供的静态方法argumentCaptor(),让编译器自动推断泛型类型,写法更简洁:
// 静态导入Mockito的argumentCaptor方法后直接创建 ArgumentCaptor<Consumer<String>> captor = argumentCaptor(); verify(你的Mock对象).目标方法(captor.capture()); Consumer<String> capturedConsumer = captor.getValue(); capturedConsumer.accept("测试用字符串"); // 验证逻辑和之前一致
注意:捕获到Consumer后,需要主动调用它的accept方法传入测试数据,才能验证其内部的处理逻辑是否符合预期。
内容的提问来源于stack exchange,提问作者piotrek
相关产品推荐
相关产品推荐

