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

如何使用Mockito mock内部类实例解决单元测试空指针问题

问题根因

空指针触发的核心原因是Mock对象的默认方法返回逻辑:你使用的AppConfig是Mockito生成的Mock对象,在没有显式指定方法返回值的情况下,所有方法调用默认返回null。你直接在Mockito.when中链式调用AppConfig.getExternalService().getUrl(),第一层getExternalService()还没指定返回值就直接调用后续的getUrl(),自然触发空指针。

修复方案

你需要分层为Mock方法打桩,先指定外层AppConfig.getExternalService()的返回值为你已经Mock好的内部类实例,再为内部类的getUrl()方法指定返回值。同时你原有测试代码存在2个可优化点:

  • 变量名AppConfig不符合小驼峰命名规范,容易和类名混淆
  • 调用isAuthorize方法时缺少必填的token入参
修正后完整测试代码
@ExtendWith(MockitoExtension.class)
class ExternalTestService{

    @Mock
    private AppConfig appConfig;
    
    @Mock
    private AppConfig.ExternalService externalServiceConfig;

    @InjectMocks
    private ExternalService externalService;

    @Test
    public void shouldAuthorize(){
        // 先为外层配置的内部配置获取方法打桩
        Mockito.when(appConfig.getExternalService()).thenReturn(externalServiceConfig);
        // 再为内部配置的url获取方法打桩
        Mockito.when(externalServiceConfig.getUrl()).thenReturn("123456");
        // 传入测试用token调用业务方法
        Assertions.assertEquals(externalService.isAuthorize("testToken"),true);
    }
}

如果你想要简化写法,也可以在声明AppConfig的Mock时启用深度打桩:@Mock(answer = Answers.RETURNS_DEEP_STUBS),此时可以直接写Mockito.when(appConfig.getExternalService().getUrl()).thenReturn("123456"),但这种方式可读性较差,更推荐分层打桩的写法。

内容的提问来源于stack exchange,提问作者MUKUL JHA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:09:03