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

如何Mock被测类内部方法?Mockito模拟失效问题解决

问题原因与解决方案

你遇到的核心问题是:@InjectMocks注入的是Test类的真实实例,Mockito无法直接mock真实对象的方法,所以你写的when(service.methodtWhichNeedMock(...)).thenReturn(...)会先执行原方法逻辑,再完成存桩,导致原代码依然被执行。

另外先纠正你代码里的拼写错误:mainMethod中调用的methdotWhichNeedMock是笔误,实际方法名是methodtWhichNeedMock,这个错误会导致编译或运行异常,先修正原类:

class Test {
    public String mainMethod() {
        // 修正方法名拼写
        String test = methodtWhichNeedMock("Hello", "World");
        return test;
    }

    public String methodtWhichNeedMock(String s1, String s2) {
        return s1 + s2;
    }
}

下面是两种可行的解决方式:


方式一:使用@Spy实现部分Mock

@Spy会创建真实对象的包装类,默认执行原方法,但通过doReturn...when语法可以跳过原方法直接返回指定值:

@ExtendWith(MockitoExtension.class)
class TestClass {
    @Spy
    Test service;

    @Test
    void mainMethod() {
        // 注意语法顺序:doReturn在前,避免触发原方法执行
        doReturn("new String").when(service).methodtWhichNeedMock("Hello", "World");
        assertEquals("new String", service.mainMethod());
    }
}

如果不需要严格匹配参数,也可以用通配符:

doReturn("new String").when(service).methodtWhichNeedMock(anyString(), anyString());

方式二:使用CALLS_REAL_METHODS创建Mock对象

通过Mockito.mock创建Mock对象时,指定CALLS_REAL_METHODS规则,让对象默认执行真实方法,仅对指定方法进行Mock:

@ExtendWith(MockitoExtension.class)
class TestClass {
    @Test
    void mainMethod() {
        // 创建一个默认执行真实方法的Mock对象
        Test service = Mockito.mock(Test.class, Mockito.CALLS_REAL_METHODS);
        // Mock目标方法
        doReturn("new String").when(service).methodtWhichNeedMock("Hello", "World");
        assertEquals("new String", service.mainMethod());
    }
}

内容的提问来源于stack exchange,提问作者Jeyzihno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:27:05