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

JUnit 5+Mockito测试AuthorService时ModelMapper空指针异常求助

解决JUnit 5 + Mockito测试中ModelMapper注入导致的NullPointerException

问题原因

报错的核心是依赖注入的字段名称不匹配:

  • AuthorService类中使用的字段是modelMapper(单数形式)
  • 测试类中通过@Mock注解创建的对象是modelMappers(复数形式)
  • Mockito的@InjectMocks通过字段名称精确匹配完成依赖注入,名称不一致时无法将Mock对象注入到Service的对应字段中,导致this.modelMapper为null,调用authorToDto方法时抛出NullPointerException。

解决方案

将测试类中的Mock对象名称修改为和Service类中一致即可:

  1. 修改测试类的@Mock字段:
@ExtendWith(MockitoExtension.class)
public class AuthorServiceTest {
    Logger logger = LoggerFactory.getLogger(AuthorService.class);
    @Mock
    AuthorRepository authorRepository;
    @Mock
    ModelMappers modelMapper; // 把modelMappers改为modelMapper,与Service中的字段名一致
    @InjectMocks
    AuthorService authorService;

    // ... 测试方法
}
  1. 同步修改测试方法中对应的Mock调用:
@Test
void isFetchAuthorByIdValid(){
    Author author = new Author(1L,"Jack","SSM","Mars");
    Mockito.when(authorRepository.fetchById(1L)).thenReturn(Optional.of(author));

    AuthorDto authorDto = new AuthorDto();
    authorDto.setAuthorId(author.getAuthorId());
    authorDto.setFirstName(author.getFirstName());
    authorDto.setLastName(author.getLastName());
    authorDto.setNation(author.getNation());
    Mockito.when(modelMapper.authorToDto(author)).thenReturn(authorDto); // 同步修改为modelMapper
    AuthorDto authorDtoResult = authorService.fetchById(1L);
    Assertions.assertNotNull(authorDtoResult);
    
    // 可选:验证modelMapper的方法是否被正确调用
    Mockito.verify(modelMapper, Mockito.times(1)).authorToDto(author);
}

补充说明

你提到BookService的测试运行正常,是因为BookService中对应的ModelMapper字段名称和测试类里的Mock对象名称完全匹配,Mockito能正常完成注入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:05:00