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

如何在Mockito-JUnit测试用例中访问被测方法内的局部对象

解决方案

完全可以实现,最常用的方案是使用Mockito自带的ArgumentCaptor参数捕获器,绝大多数场景不需要引入PowerMock即可完成需求,只有当被调用的fetchDataAndConstructResponse/notifyResponseToUser为私有方法、静态方法等Mockito原生无法mock的特殊场景时,才需要配合PowerMock使用。

实现逻辑

你需要获取的partOrderResponse是myMethod内的局部变量,最终会作为入参传入notifyResponseToUser方法,我们只需要捕获这个方法的入参,即可拿到对应的partOrderResponse实例,无需直接访问方法内部的局部变量。

普通场景实现步骤(无需PowerMock)

前置条件

fetchDataAndConstructResponse和notifyResponseToUser为类的非静态、非私有可访问方法,Mockito原生支持mock/verify。

完整测试代码示例(JUnit5 + Mockito)

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
public class MySampleClassTest {

    // 用Spy创建待测试类的实例,既可以调用真实的myMethod,也可以mock内部的其他方法
    @Spy
    private MySampleClass mySampleClass;

    @Test
    public void testMyMethod() {
        // 1. 构造测试用的Request参数
        Request testRequest = new Request();
        // 可选:如果不需要真实执行fetchDataAndConstructResponse,可以mock它的返回
        // PartOrderResponse mockResponse = new PartOrderResponse();
        // doReturn(mockResponse).when(mySampleClass).fetchDataAndConstructResponse(testRequest);

        // 2. 定义参数捕获器,类型为你要获取的PartOrderResponse
        ArgumentCaptor<PartOrderResponse> responseCaptor = ArgumentCaptor.forClass(PartOrderResponse.class);

        // 3. 执行待测试的myMethod方法
        boolean result = mySampleClass.myMethod(testRequest);

        // 4. 验证notifyResponseToUser被调用,同时捕获传入的参数
        verify(mySampleClass).notifyResponseToUser(responseCaptor.capture());

        // 5. 拿到捕获到的partOrderResponse局部变量,断言属性
        PartOrderResponse capturedResponse = responseCaptor.getValue();
        // 以下为自定义断言逻辑示例,按需修改
        assertNotNull(capturedResponse);
        assertEquals("预期的订单号", capturedResponse.getOrderId());
        assertEquals(100, capturedResponse.getTotalAmount());
        // 也可以同时断言myMethod的返回值
        assertTrue(result);
    }
}

特殊场景实现(需要PowerMock)

如果notifyResponseToUser是私有方法、静态方法,Mockito原生无法直接verify,可以配合PowerMock实现参数捕获:

  • 用PowerMock的@PrepareForTest注解标注对应类,开启特殊方法的mock能力
  • 私有方法可通过PowerMockito.verifyPrivate()配合ArgumentCaptor完成参数捕获
  • 静态方法可通过PowerMockito.verifyStatic()配合ArgumentCaptor完成参数捕获
    捕获到参数后的断言逻辑和普通场景完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:57:01