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

如何用Mockito Mock被测类内部被调用的方法?

使用Mockito Mock被测类内部调用的方法

要Mock被测类内部调用的方法,你需要用到Mockito的**部分Mock(Spy)**功能——它可以保留类的真实行为,仅替换指定方法的实现。下面是两种可行的实现方式:

方式一:使用spy()方法创建间谍对象

直接通过spy()创建真实对象的间谍实例,再指定目标方法的返回值:

import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;

public class TestMyClass {

    @Test
    public void testMethodToTest() {
        // 创建MyClass真实对象的间谍实例
        MyClass myClassSpy = spy(new MyClass());
        
        // 指定dependencyMethod的返回值,避免执行原方法逻辑
        doReturn("mocked_result").when(myClassSpy).dependencyMethod();
        
        // 调用待测试方法
        String result = myClassSpy.methodToTest();
        
        // 验证返回结果是否符合预期
        assertEquals("mocked_result", result);
        
        // 可选:验证dependencyMethod是否被调用了一次
        verify(myClassSpy, times(1)).dependencyMethod();
    }
}

关键说明

  • spy(new MyClass()):生成的间谍对象默认会调用真实方法,直到你明确Mock某个方法。
  • doReturn(...):这种写法不会触发原方法的执行,是Mock间谍对象方法的推荐方式。如果用when(myClassSpy.dependencyMethod()).thenReturn(...),会先执行一次原方法,若原方法有副作用(比如操作数据库),可能导致测试异常。

方式二:使用@Spy注解初始化间谍对象

如果习惯用注解管理测试对象,可以结合@Spy和Mockito的运行器/初始化方法:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Spy;
import org.mockito.junit.MockitoJUnitRunner;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;

@RunWith(MockitoJUnitRunner.class)
public class TestMyClass {

    @Spy
    private MyClass myClassSpy;

    @Test
    public void testMethodToTest() {
        doReturn("mocked_result").when(myClassSpy).dependencyMethod();
        
        String result = myClassSpy.methodToTest();
        
        assertEquals("mocked_result", result);
        // 验证方法调用次数
        verify(myClassSpy).dependencyMethod();
    }
}

替代初始化方式

如果不想用@RunWith,可以在@Before方法中手动初始化注解:

import org.junit.Before;
import org.junit.Test;
import org.mockito.Spy;
import org.mockito.MockitoAnnotations;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;

public class TestMyClass {

    @Spy
    private MyClass myClassSpy;

    @Before
    public void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    public void testMethodToTest() {
        // 测试逻辑同上
    }
}

注意事项

  • 部分Mock(Spy)是权宜之计:如果可以重构代码,建议将dependencyMethod抽离为独立的依赖类,再Mock这个依赖类——这能降低代码耦合度,让测试更清晰。
  • 避免过度使用Spy:它可能掩盖代码设计上的问题,比如职责不单一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:52:52