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

Mockito中如何使用未被直接调用的Mock对象?

如何在Foo的xMethod中使用Mock的Ent实例

问题分析

你当前的写法无法直接将Mock的Ent注入到Foo的xMethod中,因为ent是通过y.callExternalMethod()生成的局部变量,@InjectMocks仅能注入Foo的成员变量,无法替换方法内的局部变量。正确的做法是Mocky这个依赖,让它返回你预设的Ent实例。

步骤1:调整Foo类,让依赖y可注入

首先需要把y作为Foo的成员变量,并提供注入方式(构造方法或setter均可):

class Foo {
    // 将y声明为成员变量,支持依赖注入
    private Y y;

    // 通过构造方法注入y
    public Foo(Y y) {
        this.y = y;
    }

    public String xMethod() {
        Ent ent = y.callExternalMethod();
        if(ent.equals("")){
            // ...原有业务逻辑
        }
        // ...其他逻辑
        return someResult;
    }
}

步骤2:修改测试类,Mock依赖y并预设返回值

在测试类中Mocky,并指定它调用callExternalMethod()时返回你需要的Ent实例(可以是自定义实例,也可以是Mock的Ent):

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import static org.mockito.Mockito.when;

class FooTest {
    // Mock Foo依赖的y对象
    @Mock
    private Y y;

    // 注入Mock的y到Foo实例中
    @InjectMocks
    private Foo f;

    // 初始化Mockito注解
    @Before
    public void setUp() {
        MockitoAnnotations.openMocks(this);
    }

    @Test
    public void checkFooWithMock() {
        // 方式1:使用自定义的Ent实例
        Ent targetEnt = new Ent(someData);
        
        // 方式2:如果需要Mock Ent的行为,可以直接Mock Ent
        // @Mock
        // private Ent targetEnt;

        // 设定当y调用callExternalMethod时,返回我们预设的Ent
        when(y.callExternalMethod()).thenReturn(targetEnt);

        // 如果用了Mock的Ent,还可以预设它的方法行为,比如equals判断
        // when(targetEnt.equals("")).thenReturn(true);

        // 执行测试方法
        String result = f.xMethod();

        // 这里添加断言验证结果,比如:
        // assertEquals(expectedResult, result);
    }
}

关键说明

  • 核心思路:Mock依赖源而非局部变量,因为局部变量是方法内部生成的,无法直接被Mockito替换,只能通过控制它的生成来源(即y.callExternalMethod())来获取预设的实例。
  • 确保Y类是一个可被Mock的类型(比如不是final类,方法不是final方法),否则Mockito无法生成Mock实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 07:25:25