spring-boot - 模拟方法总是返回空 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());
}
}
解决方案
推荐阅读
- node.js - 尽管使用了正确的连接凭据,但仍无法将 node.js 应用程序连接到 MongoDB Atlas
- ios - 更改 LLDB 中 const 变量的值
- java - 方法没有被正确调用?!卡路里应用
- html - 2列CSS网格,直到一定宽度
- c# - C# .NetTcpBinding 2 服务在同一端口 5000
- dart - 如何在一个语句中按多个级别对 angular dart 中的列表进行排序?
- javascript - 单击或按下空格键时启动/停止 Cube Timer
- r - 是否有一个 R 函数可以在缺少某些年份时通过在国家/地区分组来帮助将变量滞后一年?
- mysql - “设置foreign_key_checks = 0;” 但仅适用于一个数据库
- c - 无法将整数数组作为参数传递给本地参数为字符指针的函数