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
相关产品推荐
相关产品推荐

