You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:36:07