Mapstruct 映射器使用 mockito 返回空对象尽管被嘲笑

问题描述 投票:0回答:0

我有一个将一种类型转换为另一种类型的映射器。我正在为自动装配映射器的业务(服务层)编写单元测试。在相应的服务类 Junit 中,我使用模拟注释模拟映射器。在调试时我可以看到映射器被模拟但是在调试进入服务层之后模拟的映射器方法返回空对象

映射器类

@Mapper(componentModel = "spring")
public interface EmployeeHolidayMapper {

    @Mapping(target = "employeeEntity.empId",source = "employeeHolidayDto.empId")
    @Mapping(target = "leaveStartDate",expression = "java(LocalDate.parse(employeeHolidayDto"
            + ".getEmpLeaveStartDate().toString(),dateTimeFormatter))")
    @Mapping(target = "leaveEndDate",expression = "java(LocalDate.parse(employeeHolidayDto"
            + ".getEmpLeaveEndDate().toString(),dateTimeFormatter))")
    public EmployeeHolidayEntity employeeHoliDayDtoToEmployeeHolidayEntity(EmployeeHolidayDto 
            employeeHolidayDto,LocalDate localDate,DateTimeFormatter dateTimeFormatter);

服务等级

@Service
@RequiredArgsConstructor
public class EmployeeHolidayService {

    
    private final HolidayRepo holidayRepo;
    
    private final EmployeeHolidayRepo employeeHolidayRepo;
    
    private final EmployeeHolidayMapper employeeHolidayMapper;
    

    public Mono<Integer> saveEmployeeHolidayData(EmployeeHolidayDto employeeHolidayDto){
        return  Optional.ofNullable(employeeHolidayDto)
        .filter(dto->dto.getEmpLeaveEndDate()!=null && dto.getEmpLeaveStartDate() != null 
           && dto.getEmpLeaveStartDate() > 0 && dto.getEmpLeaveEndDate() > 0 && dto.getEmpLeaveEndDate()
           .compareTo(dto.getEmpLeaveStartDate()) >=0)
        .map(dto->{
                EmployeeHolidayEntity employeeHolidayEntity = employeeHolidayMapper
                        .employeeHoliDayDtoToEmployeeHolidayEntity(dto, LocalDate.now(),
                                DateTimeFormatter.BASIC_ISO_DATE);
                int diffOfDays = employeeHolidayEntity.getLeaveEndDate().getDayOfYear()
                        - employeeHolidayEntity.getLeaveStartDate().getDayOfYear();
                int noOfLeavesLeft = holidayRepo.getNoofLeavesLeft(dto.getEmpId()) - (diffOfDays);
                if (noOfLeavesLeft > 0) {
                    int updatedRows = holidayRepo.updateNoLeaveDays(dto.getEmpId(), noOfLeavesLeft);
                    if (updatedRows > 0) {
                        EmployeeHolidayEntity employeeHolidayEntitySaved = employeeHolidayRepo
                                .saveAndFlush(employeeHolidayEntity);
                        if (employeeHolidayEntitySaved.getEmployeeHolidayId() > 0) {
                            return Mono.just(updatedRows);
                        } else {
                            return Mono.just(0);
                        }
                    } else {
                        return Mono.just(0);
                    }
                }
                else {
                    return Mono.just(0);
                }
            
        })
        .orElse(null);
    }

使用 mockito 的 Junit 类

@ExtendWith(MockitoExtension.class)
class HolidaymanagementApplicationTests {

    @Mock
    HolidayRepo holidayRepo;

    @Mock
    EmployeeHolidayRepo employeeHolidayRepo;

    @Mock
    EmployeeHolidayMapper employeeHolidayMapper;

    @InjectMocks
    EmployeeHolidayService employeeHolidayService;

    @Test
    void testPostrequest() {
        String startDate = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
        String endDate = LocalDate.now().plusDays(2).format(DateTimeFormatter.BASIC_ISO_DATE);
        EmployeeHolidayDto employeeHolidayDto = new EmployeeHolidayDto(1, Integer.parseInt(startDate),
                Integer.parseInt(endDate));
        EmployeeEntity employeeEntity = new EmployeeEntity(1, null, null, null, null);
        EmployeeHolidayEntity employeeHolidayEntity = new EmployeeHolidayEntity(1,
                LocalDate.parse(startDate, DateTimeFormatter.BASIC_ISO_DATE),
                LocalDate.parse(endDate, DateTimeFormatter.BASIC_ISO_DATE), employeeEntity);
        when(employeeHolidayMapper.employeeHoliDayDtoToEmployeeHolidayEntity(employeeHolidayDto, LocalDate.now(),
                DateTimeFormatter.BASIC_ISO_DATE)).thenReturn(employeeHolidayEntity);
        HolidayEntity holidayEntity = new HolidayEntity(1, 10, employeeEntity);
        when(holidayRepo.getNoofLeavesLeft(1)).thenReturn(10);
        when(holidayRepo.updateNoLeaveDays(1, 8)).thenReturn(1);
        EmployeeHolidayEntity employeeHolidayDbEntity = new EmployeeHolidayEntity(1,
                employeeHolidayEntity.getLeaveStartDate(), employeeHolidayEntity.getLeaveEndDate(), employeeEntity);
        when(employeeHolidayRepo.saveAndFlush(employeeHolidayEntity)).thenReturn(employeeHolidayDbEntity);
        assertEquals(employeeHolidayService.saveEmployeeHolidayData(employeeHolidayDto).block(), 
                1);

在上面的代码中调试时我可以看到映射器被模拟了。现在,当实现从 asserEquals 语句转到服务类时。通过映射器获取的 EmployeeHolidayEntity 对象返回 null。

当运行代码时,spring boot 应用程序映射器工作正常并返回对象。

spring-boot mockito junit5 mapstruct
© www.soinside.com 2019 - 2024. All rights reserved.