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类中一致即可:
- 修改测试类的@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; // ... 测试方法 }
- 同步修改测试方法中对应的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
相关产品推荐
相关产品推荐

