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

如何Mock调用其他带参方法的方法?自定义参数测试method1

实现自定义参数调用的测试方案

假设你的method1定义在ClassA类中,method2属于另一个ClassB类,下面用Mockito框架实现测试时让method1调用method2传入自定义参数的需求:

1. 依赖准备

确保测试依赖中包含Mockito(以Maven为例):

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>4.8.1</version>
    <scope>test</scope>
</dependency>

2. 测试用例实现

方式一:拦截调用并替换参数(执行真实method2逻辑)

原method1中固定传入1和3作为method2的g、h参数,我们可以通过Spy对象拦截这个调用,替换为自定义参数后执行真实的method2逻辑:

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

import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doAnswer;

public class ClassATest {

    @Test
    public void testMethod1WithCustomParams() {
        // 初始化真实实例
        ClassB realClassB = new ClassB();
        ClassA classA = new ClassA(realClassB); // 假设ClassA通过构造注入ClassB

        // 创建ClassB的Spy对象,用于拦截方法调用
        ClassB spyClassB = Mockito.spy(realClassB);
        // 替换ClassA中的ClassB实例为Spy对象
        classA.setClassB(spyClassB);

        // 定义自定义的g、h参数
        int customG = 5;
        int customH = 6;

        // 拦截method2的所有调用,替换参数后执行真实方法
        doAnswer(invocation -> {
            // 获取原调用的a、b参数
            int a = invocation.getArgument(0);
            int b = invocation.getArgument(1);
            // 用自定义参数调用真实的method2
            return spyClassB.method2(a, b, customG, customH);
        }).when(spyClassB).method2(anyInt(), anyInt(), anyInt(), anyInt());

        // 调用method1,这里c参数按实际逻辑传值即可
        int result = classA.method1(2, 3, 0);

        // 验证结果:2+3+5+6=16
        assertEquals(16, result);
    }
}

方式二:Mock method2返回自定义结果(跳过真实逻辑)

如果不需要执行method2的真实逻辑,只是想模拟返回值,可以直接MockClassB:

import org.junit.Test;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.junit.runner.RunWith;

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

@RunWith(MockitoJUnitRunner.class)
public class ClassATest {

    @Mock
    private ClassB classB;

    private ClassA classA;

    @Test
    public void testMethod1WithMockedResult() {
        classA = new ClassA(classB);
        int a = 2;
        int b = 3;
        // 自定义参数对应的预期结果
        int expectedResult = a + b + 5 + 6;

        // 当method2传入原固定参数1、3时,返回自定义参数计算的结果
        when(classB.method2(a, b, 1, 3)).thenReturn(expectedResult);

        // 调用method1
        int result = classA.method1(a, b, 0);

        assertEquals(expectedResult, result);
    }
}

3. 注意事项

  • 如果method2是ClassA的内部方法,只需将Spy对象改为ClassA的实例,拦截逻辑保持一致。
  • doAnswer是实现参数替换的核心,它允许你在拦截方法调用时完全自定义参数和执行逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:42:22