Mockito报0 matcher expected, 1 recorded参数匹配器使用错误问题咨询
Mockito参数匹配器使用无效报错分析及解决
报错说明
参数匹配器使用无效!
期望0个匹配器,实际记录了1个
报错代码行:
InputStreamResource isr=new InputStreamResource(new ByteArrayInputStream(anyString().getBytes()));
产生原因
- Mockito的参数匹配器(如
anyString()、anyInt()等)仅允许在Mock方法打桩、方法调用验证这两类场景中使用,不可以直接用于普通Java对象的构造逻辑中。 - 当前代码在构造
ByteArrayInputStream的入参时直接调用了anyString(),不属于Mockito的合法使用场景,anyString()不会返回真实字符串值,反而会被Mockito记录为未消费的匹配器,触发匹配器计数不匹配的报错。 - 此外
anyString()返回的是Mockito的占位符对象,直接调用其getBytes()方法属于对Mock代理对象的非法调用,本身也会产生逻辑错误。
解决方法
根据使用场景选择对应方案:
场景1:仅需要构造真实的InputStreamResource用于测试
直接将anyString()替换为自定义的测试字符串即可:
// 替换为实际测试需要的字符串内容 String testContent = "test demo content"; InputStreamResource isr = new InputStreamResource(new ByteArrayInputStream(testContent.getBytes()));
场景2:给返回InputStreamResource的Mock方法打桩
参数匹配器仅放在打桩方法的入参位置,返回值的构造使用真实字符串:
// 错误写法:匹配器误用在返回值构造逻辑中 when(mockComponent.getResource(any())).thenReturn(new InputStreamResource(new ByteArrayInputStream(anyString().getBytes()))); // 正确写法 String mockReturnContent = "mock return content"; when(mockComponent.getResource(any())).thenReturn(new InputStreamResource(new ByteArrayInputStream(mockReturnContent.getBytes())));
场景3:需要根据Mock方法的入参动态生成返回值
使用Mockito的Answer接口实现动态处理逻辑:
when(mockComponent.getResource(anyString())).thenAnswer(invocation -> { // 拿到调用时传入的实际字符串参数 String inputParam = invocation.getArgument(0, String.class); return new InputStreamResource(new ByteArrayInputStream(inputParam.getBytes())); });
内容的提问来源于stack exchange,提问作者Suvo Sarkar
相关产品推荐
相关产品推荐

