Mockito单元测试中已Mock类的创建/模拟及空指针问题解决
解决FileService单元测试中UtilsClass调用空指针问题
问题原因
- 你用
@Mock创建了ServiceClass实例,但Mockito的@InjectMocks只会将依赖注入到标注了@InjectMocks的FileService中,不会自动把UtilsClass注入到Mock的ServiceClass内部。 - 当你给
serviceClass.method_service_class()指定thenCallRealMethod()时,实际执行的是ServiceClass的真实方法,但它的utilsClass属性未被赋值,因此调用utilsClass.method()时抛出空指针异常。 - 测试代码存在语法错误:
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
相关产品推荐
相关产品推荐

