首页 > 解决方案 > 模拟 JpaRepository使用 Mockito

问题描述

我有一个包含 JpaRepository<ENTITY, Long> 类型对象的超类。

public class BaseServiceImpl<CREATE_DTO, UPDATE_DTO, RESPONSE_DTO, ENTITY> implements BaseService<CREATE_DTO, UPDATE_DTO, RESPONSE_DTO, ENTITY> {

@Autowired
protected JpaRepository<ENTITY, Long> jpaRepository;

@Autowired
protected BaseMapper<CREATE_DTO, UPDATE_DTO, RESPONSE_DTO, ENTITY> baseMapper;

@Override
public List<RESPONSE_DTO> findAll() {
    return jpaRepository.findAll()
                        .stream()
                        .map(baseMapper::entityToResponseDto)
                        .collect(Collectors.toList());
}

@Override
public RESPONSE_DTO findById(Long id) {
    return jpaRepository.findById(id)
            .map(baseMapper::entityToResponseDto)
            .orElseThrow(() -> {
                throw new RuntimeException("Entity with id: " + id + " does not exist!");
            });
}

@Override
public RESPONSE_DTO save(CREATE_DTO entity) {
    return baseMapper.entityToResponseDto(jpaRepository.save(baseMapper.createDtoToEntity(entity)));
}

}

我正在尝试使用 JUnit 和 Mockito 为 findAll 方法编写单元测试。我面临的问题与模拟 BaseServiceImpl 中存在的 JpaRepository 有关。

我试过这样实现

@ExtendWith(MockitoExtension.class)
public class IngredientServiceImplTest {

@Mock
private JpaRepository<Ingredient, Long> jpaRepository;
}

但我得到以下异常:

java.lang.NullPointerException: Cannot invoke "org.springframework.data.jpa.repository.JpaRepository.findAll()" because "this.jpaRepository" is null

有人可以告诉我什么是模拟它的正确方法吗?

标签: springunit-testingjunitmockito

解决方案


我想你也应该注入模拟@InjectMocks

@Mock
private JpaRepository<Ingredient, Long> jpaRepository;

@InjectMocks
private BaseServiceImpl baseService

推荐阅读