如何编写以URI为输入的JUnit测试用例 解决ModelMapper空指针异常
空指针异常原因及修复方案
你当前出现空指针的核心原因是单元测试逻辑完全脱离待测试业务流程,且未对所有依赖组件做mock/初始化,具体问题点:
- 待测试的
getApplicationScanConfig方法依赖ApiClient、ModelMapper两个组件,你既没有初始化这两个对象,也没有通过mock框架生成代理实例,直接调用就会触发空指针 - 测试代码没有调用待测试的业务方法,反而自行实现了
restTemplate调用+modelMapper映射的逻辑,完全不符合单元测试的设计目标 - 没有对外部接口调用的返回结果做mock,若
ApiClient的getOperation方法返回null,传入modelMapper.map也会触发空指针
修正后的单元测试实现(基于JUnit5 + Mockito)
首先确保你引入了Mockito测试依赖,测试代码示例如下:
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.modelmapper.ModelMapper; import java.net.URI; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static org.junit.jupiter.api.Assertions.*; // 这里替换为你实际的待测试业务类 class YourBusinessServiceTest { // Mock待测试类的依赖组件 @Mock private ApiClient apiClient; @Mock private ModelMapper modelMapper; // 把mock的依赖自动注入到待测试实例中 @InjectMocks private YourBusinessService yourBusinessService; @Test void testGetApplicationScanConfig() throws Exception { // 1. 构造测试入参 int testAccountId = 1; String testScanConfigId = "1"; URI expectUri = new URI("/api/scheduleOnDemand?Account_Id=1&applicationConfigScanId=1"); // 构造模拟的接口返回对象和DTO对象 Object mockApiResponse = new Object(); ApplicationScanConfigDTO mockDto = new ApplicationScanConfigDTO(); mockDto.setId(1); mockDto.setAccountId(testAccountId); // 2. Mock依赖方法的返回逻辑 when(apiClient.getOperation(eq(expectUri), eq(Object.class))).thenReturn(mockApiResponse); when(modelMapper.map(eq(mockApiResponse), eq(ApplicationScanConfigDTO.class))).thenReturn(mockDto); // 3. 调用待测试的业务方法 ApplicationScanConfigDTO result = yourBusinessService.getApplicationScanConfig(testAccountId, testScanConfigId); // 4. 断言结果符合预期,同时验证依赖方法被正确调用 assertNotNull(result); assertEquals(testAccountId, result.getAccountId()); verify(apiClient, times(1)).getOperation(eq(expectUri), eq(Object.class)); verify(modelMapper, times(1)).map(eq(mockApiResponse), eq(ApplicationScanConfigDTO.class)); } }
如果需要做集成测试真实发送请求,需要初始化RestTemplate实例、配置ApiClient的baseUrl属性,避免属性未赋值触发空指针。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

