SpringBoot升级至3.x(Mockito5.x)后单元测试失败:参数匹配器误用
SpringBoot升级至3.x(Mockito5.x)后单元测试InvalidUseOfMatchersException问题解决
问题分析
将SpringBoot从2.7版本(对应Mockito4.x)升级到3.1.4或3.4.0版本(对应Mockito5.x)后,单元测试抛出InvalidUseOfMatchersException,核心原因是Mockito5.x对类型安全的校验更为严格,原代码中使用了原始类型的Answer,导致匹配器的使用不符合新版本规范。
代码问题点
原测试代码中,when方法后的then回调使用了未指定泛型类型的Answer:
when(Mockobj.getMethod(anyString(), org.mockito.Mockito.any(StringBuilder.class))) .then(new Answer() { // 此处为原始类型Answer,无泛型声明 @Override public Integer answer(InvocationOnMock invocation) throws Throwable { StringBuilder sbd = invocation.getArgument(1); sbd.append(reader.getJsonStringFromFile(Constants.sample)); throw new RuntimeException("Runtime exception"); } });
修复方案
为Answer指定与方法返回值一致的泛型类型(此处为Integer),即可解决匹配器异常:
when(Mockobj.getMethod(anyString(), org.mockito.Mockito.any(StringBuilder.class))) .then(new Answer<Integer>() { // 指定泛型类型Integer @Override public Integer answer(InvocationOnMock invocation) throws Throwable { StringBuilder sbd = invocation.getArgument(1); sbd.append(reader.getJsonStringFromFile(Constants.sample)); throw new RuntimeException("Runtime exception"); } });
额外优化建议
- 静态导入Mockito匹配器,简化代码:
在类顶部添加静态导入:
之后可直接使用import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyString;anyString()和any(StringBuilder.class),无需全限定类名。
内容的提问来源于stack exchange,提问作者shogv48
相关产品推荐
相关产品推荐

