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

Mockito单元测试中已Mock类的创建/模拟及空指针问题解决

解决FileService单元测试中UtilsClass调用空指针问题

问题原因

  1. 你用@Mock创建了ServiceClass实例,但Mockito的@InjectMocks只会将依赖注入到标注了@InjectMocks的FileService中,不会自动把UtilsClass注入到Mock的ServiceClass内部。
  2. 当你给serviceClass.method_service_class()指定thenCallRealMethod()时,实际执行的是ServiceClass的真实方法,但它的utilsClass属性未被赋值,因此调用utilsClass.method()时抛出空指针异常。
  3. 测试代码存在语法错误:when(utilsClass.method_service_class()).thenCallRealMethod();无效,因为UtilsClass的方法名是method(),不是method_service_class()。

解决方案

方案1:只验证FileService的调用逻辑(推荐单元测试标准做法)

单元测试的核心是验证当前类的逻辑是否正确,无需关心依赖类的内部实现。只需确认FileService正确调用了ServiceClass的方法即可:

@ExtendWith(MockitoExtension.class)
public class FileServiceImplTest {
     @InjectMocks
     FileService fileService;
     
     @Mock
     ServiceClass serviceClass;
     
     @Test
     public void testMethod_class_FileService() {
          // 执行测试方法
          fileService.method_class_FileService();
          
          // 验证serviceClass的方法是否被调用一次
          verify(serviceClass, times(1)).method_service_class();
     }
}

方案2:需要执行ServiceClass真实方法的场景

如果必须让ServiceClass执行真实逻辑,需要将ServiceClass改为@Spy代理真实对象,同时用@InjectMocks为其注入UtilsClass:

@ExtendWith(MockitoExtension.class)
public class FileServiceImplTest {
     @InjectMocks
     FileService fileService;
     
     @Spy
     @InjectMocks
     ServiceClass serviceClass;

     @Mock
     UtilsClass utilsClass;
     
     @Test
     public void testMethod_class_FileService() {
          // 可选:如果需要执行UtilsClass的真实方法,取消下面注释
          // when(utilsClass.method()).thenCallRealMethod();
          
          fileService.method_class_FileService();
          
          // 验证UtilsClass的方法是否被调用
          verify(utilsClass, times(1)).method();
     }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:47:28