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

Java中如何Mock嵌套函数调用int var = func1(func2(obj.func3()))并指定返回值

如何Mock嵌套调用 int var = func1(func2(obj.func3())) 并指定结果

下面分几种常见场景给出具体实现方案,基于Mockito和PowerMock(处理静态方法)这两个常用Mock框架:


场景1:obj是可Mock的实例对象(非静态类)

如果obj是你能注入的Mock实例,从最内层调用开始逐层Mock,最终让整个调用链返回预设结果:

假设obj.func3()返回String,func2(String)返回Integer,func1(Integer)返回int,示例代码:

// 1. Mock obj实例
YourObj obj = mock(YourObj.class);
// 2. 先Mock最内层的obj.func3(),返回预设值
when(obj.func3()).thenReturn("mock_input");
// 3. 如果func2是另一个服务类的实例方法,同样Mock该服务
Func2Service func2Service = mock(Func2Service.class);
when(func2Service.func2("mock_input")).thenReturn(99);
// 4. Mock外层的func1所在的服务
Func1Service func1Service = mock(Func1Service.class);
when(func1Service.func1(99)).thenReturn(2024);
// 执行目标语句,var会被赋值为2024
int var = func1Service.func1(func2Service.func2(obj.func3()));

场景2:func1/func2是静态方法(用PowerMock)

常规Mockito不支持静态方法Mock,需要搭配PowerMock实现:

先给测试类添加PowerMock注解,再逐层Mock静态方法:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Func1Static.class, Func2Static.class}) // 包含静态方法的类
public class NestedMockTest {
    @Test
    public void testStaticNestedMock() {
        // 1. Mock obj的func3()
        YourObj obj = mock(YourObj.class);
        when(obj.func3()).thenReturn("static_mock_val");
        
        // 2. Mock静态方法func2,指定输入对应的返回
        PowerMockito.mockStatic(Func2Static.class);
        when(Func2Static.func2("static_mock_val")).thenReturn(50);
        
        // 3. Mock静态方法func1,指定最终返回值
        PowerMockito.mockStatic(Func1Static.class);
        when(Func1Static.func1(50)).thenReturn(150);
        
        // 执行目标语句,var的值为150
        int var = Func1Static.func1(Func2Static.func2(obj.func3()));
    }
}

场景3:跳过内层细节,直接Mock整个调用结果

如果你不想关心func2和obj.func3()的具体逻辑,只想让整个表达式返回指定值,可以用参数匹配器忽略输入:

实例方法场景:

Func1Service func1Service = mock(Func1Service.class);
// 不管func1传入什么参数,都返回200
when(func1Service.func1(anyInt())).thenReturn(200);
// 此时不管内层调用返回什么,var都会是200
int var = func1Service.func1(func2Service.func2(obj.func3()));

静态方法场景(PowerMock):

PowerMockito.mockStatic(Func1Static.class);
// 忽略func1的输入参数,直接返回指定值
when(Func1Static.func1(anyInt())).thenReturn(200);
int var = Func1Static.func1(Func2Static.func2(obj.func3()));

内容的提问来源于stack exchange,提问作者Rakshit P R Vashishta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:15:40