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

