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

如何Mock工厂类,使其返回携带相同参数的真实C对象?

Mock工厂类返回真实实例的实现方案

没问题,我来帮你搞定这个需求!下面以Java常用的Mockito框架为例,给你详细的解决方案:

首先先明确我们的基础类结构,方便你对照自己的代码:

// C类,构造函数接收两个参数
public class C {
    private final String param1;
    private final int param2;

    public C(String param1, int param2) {
        this.param1 = param1;
        this.param2 = param2;
    }

    // 可选:添加getter方法用于验证结果
    public String getParam1() { return param1; }
    public int getParam2() { return param2; }
}

// 工厂类接口(如果你的工厂是类而非接口,也可以用Mockito处理,后面会说明)
public interface Factory {
    C create(String param1, int param2);
}

接下来是核心的Mock配置和测试代码:

import org.junit.Test;
import org.mockito.Mockito;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

public class FactoryMockTest {

    @Test
    public void testMockFactoryReturnsRealCInstance() {
        // 1. 创建Factory的Mock对象
        Factory mockFactory = Mockito.mock(Factory.class);

        // 2. 配置create方法的行为:根据传入参数返回真实的C实例
        when(mockFactory.create(Mockito.anyString(), Mockito.anyInt()))
                .thenAnswer(invocation -> {
                    // 获取调用create时传入的两个参数
                    String inputParam1 = invocation.getArgument(0);
                    int inputParam2 = invocation.getArgument(1);
                    // 用这些参数实例化真实的C对象并返回
                    return new C(inputParam1, inputParam2);
                });

        // 3. 调用Mock工厂的create方法
        C createdInstance = mockFactory.create("hello", 456);

        // 4. 验证返回的确实是用传入参数创建的真实C对象
        assertEquals("hello", createdInstance.getParam1());
        assertEquals(456, createdInstance.getParam2());
    }
}

关键细节说明:

  • thenAnswer是Mockito里的核心方法,它允许我们自定义方法调用的返回逻辑,而不是返回预先设定的固定对象。
  • invocation.getArgument(index)用于获取方法调用时传入的参数,索引从0开始对应方法的第一个参数。
  • 如果你的Factory是具体类而非接口:只要这个类不是final的,Mockito就能正常Mock它;如果是final类,你需要在Mockito的配置文件(src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker)中添加mock-maker-inline来支持Mock final类。

如果使用其他Mock框架(比如EasyMock、PowerMock),核心思路也是一致的:捕获方法调用的参数,然后用这些参数实例化真实的C对象返回。Mockito因为易用性和普及度,是最推荐的选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:58:55