JUnit4+Mockito5参数匹配器报InvalidUseOfMatchersException如何修复
问题原因分析
- 打桩对象非法:Mockito仅支持对Mock/Spy实例的方法进行打桩(
when(...))、校验(verify(...))操作,如果你的baseController是手动new的真实实例,不是Mockito生成的Mock/Spy对象,直接使用when打桩就会抛出匹配器误用异常。 - 测试逻辑错误:你当前要测试的目标就是
Randoms方法本身,完全不需要对该方法做打桩。打桩后方法会直接返回你指定的固定值,完全不执行真实逻辑,测试失去意义;且你打桩指定返回10,后续又断言结果小于10,逻辑完全矛盾。 - 匹配器使用错误:参数匹配器
any()、isA()必须和Mock/Spy的打桩/校验操作配套使用,你在非Mock对象的方法上使用匹配器本身就属于错误用法,所以替换匹配器也无法解决问题。
正确测试代码实现
你的测试目标是验证Randoms方法的真实逻辑,不需要打桩该方法本身,只需要Mock依赖的ModelAndView实例即可,参考代码如下:
import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.web.servlet.ModelAndView; import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) public class BaseControllerTest { // 测试真实的Controller实例,不要用Mock private BaseController baseController = new BaseController(); // Mock ModelAndView依赖 @Mock private ModelAndView modelAndView; // 测试场景1:入参为null的情况 @Test public void testRandoms_withNullModel() { int result = baseController.Randoms(null); Assert.assertEquals(0, result); } // 测试场景2:入参不为null的情况 @Test public void testRandoms_withValidModel() { int result = baseController.Randoms(modelAndView); // 验证返回值在1-10范围内 Assert.assertTrue(result >= 1 && result <= 10); // 验证ModelAndView的addObject方法被正确调用 verify(modelAndView).addObject("ra", result); } }
补充说明
如果你确实需要对Controller的部分方法打桩(比如测试某方法时要屏蔽其调用的其他内部方法),请使用@Spy注解实例化Controller,仅对需要屏蔽的内部方法打桩,不要打桩当前要测试的目标方法。
内容的提问来源于stack exchange,提问作者Junhong
相关产品推荐
相关产品推荐

