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

