我有一个将一种类型转换为另一种类型的映射器。我正在为自动装配映射器的业务(服务层)编写单元测试。在相应的服务类 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 应用程序映射器工作正常并返回对象。