首页 > 解决方案 > 模拟方法总是返回空 Optional

问题描述

所以我是单元测试的新手。

我正在尝试在 IngredientServiceImplTest 中测试 findAll() 方法的行为。

我面临的问题与模拟方法的返回值有关。它总是返回空,从而引发异常。

有人可以告诉我我错过了什么吗?

测试班。

@ExtendWith(MockitoExtension.class)
class IngredientServiceImplTest {
   @Mock
   private MenuItemIngredientRepository menuItemIngredientRepository;

   @Mock
   private IngredientRepository ingredientRepository;

   @InjectMocks
   private IngredientServiceImpl ingredientService;

   @Mock
   private JpaRepository<Ingredient, Long> jpaRepository;

   @Mock
   private BaseMapper<IngredientCreateDto, IngredientUpdateDto, IngredientResponseDto, 
   Ingredient> baseMapper;


   @BeforeEach
   void init() {
       ingredientService.jpaRepository = jpaRepository;
       ingredientService.baseMapper = baseMapper;
   }

  @Test
  void When_FindById_ReturnIngredient() {

      Ingredient ingredient = new Ingredient();
      ingredient.setId(1L);
      ingredient.setName("Name");

      IngredientCreateDto ingredientCreateDto = new IngredientCreateDto();
      ingredientCreateDto.setName("Name");

      when(jpaRepository.findById(ingredient.getId())).thenReturn(Optional.of(ingredient));
      when(baseMapper.createDtoToEntity(ingredientCreateDto)).thenReturn(ingredient);
      assertEquals(ingredientService.findById(ingredient.getId()).getName(), 
 
    }

基础服务类

@AllArgsConstructor
@NoArgsConstructor
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)));
}
}

配料服务类

@Service
@AllArgsConstructor
@Validated
public class IngredientServiceImpl extends BaseServiceImpl<IngredientCreateDto, IngredientUpdateDto, IngredientResponseDto, Ingredient> implements IngredientService{

private final MenuItemIngredientRepository menuItemIngredientRepository;
private final IngredientRepository ingredientsRepository;

@Override
public IngredientResponseDto update(Long id, IngredientUpdateDto ingredient) {
    super.findById(id);
    Ingredient entityIngredient = baseMapper.updateDtoToEntity(ingredient);
    entityIngredient.setId(id);
    entityIngredient.setUpdatedAt(LocalDateTime.now());
    return baseMapper.entityToResponseDto(jpaRepository.save(entityIngredient));

}

@Override
public List<IngredientResponseDto> findTopIngredients(Integer n) {
    return menuItemIngredientRepository.findTopIngredients(n)
            .stream()
            .map(id -> baseMapper.entityToResponseDto(jpaRepository.getOne(id)))
            .collect(Collectors.toList());
}

@Override
public List<IngredientResponseDto> findAllByFilter(IngredientFilter ingredientFilter) {
    return ingredientsRepository.findAllByFilter(ingredientFilter)
            .stream()
            .map(ingredient -> baseMapper.entityToResponseDto(ingredient))
            .collect(Collectors.toList());
}


}

标签: spring-bootjunitmockito

解决方案


推荐阅读