сегодня у меня проблема с моим частным проектом. Хотя сущность сохраняется с использованием DTO каждый раз, когда я получаю исключение NullPointerException.
Обычно, до этого момента я использовал DTO без идентификатора идентификатора, но в итоге выяснилось, что мне нужно поле идентификатора, потому что оно требуется на стороне графического интерфейса для изменения или удаления одного конкретного объекта.
Сущность с DTO ниже:
@RequiredArgsConstructor
public class DiscountCode {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NonNull private LocalDateTime startDate;
@NonNull private LocalDateTime endDate;
@NonNull @NotBlank private String code;
private Integer quantity;
@NonNull private BigDecimal rate;
@NonNull
@Enumerated(EnumType.STRING)
private DiscountCodeStatus status;
}
@RequiredArgsConstructor
public class DiscountCodeDto {
private Long id;
@NonNull private LocalDateTime startDate;
@NonNull private LocalDateTime endDate;
@NonNull private String code;
private Integer quantity;
@NonNull private BigDecimal rate;
@NonNull
@Enumerated(EnumType.STRING)
private DiscountCodeStatus status;
}
С полной утилитой lombok.
Mapper ниже:
public class DiscountCodeMapper {
private DiscountCodeMapper() {
throw new UnsupportedOperationException();
}
public static DiscountCodeDto toDto(DiscountCode discountCode) {
return isNull(discountCode)
? null
: DiscountCodeDto.builder()
.id(discountCode.getId())
.startDate(discountCode.getStartDate())
.endDate(discountCode.getEndDate())
.code(discountCode.getCode())
.quantity(discountCode.getQuantity())
.rate(discountCode.getRate())
.build();
}
public static DiscountCode fromDto(DiscountCodeDto discountCodeDto) {
return isNull(discountCodeDto)
? null
: DiscountCode.builder()
.id(discountCodeDto.getId())
.startDate(discountCodeDto.getStartDate())
.endDate(discountCodeDto.getEndDate())
.code(discountCodeDto.getCode())
.quantity(discountCodeDto.getQuantity())
.rate(discountCodeDto.getRate())
.build();
}
}
Метод обслуживания ниже:
@Service
@RequiredArgsConstructor
public class DiscountCodeService {
private final DiscountCodeRepository discountCodeRepository;
public DiscountCodeDto add(final DiscountCodeDto discountCodeDto) {
checkArgument(nonNull(discountCodeDto), "Expected not null discountCodeDto");
DiscountCode discountCode =
discountCodeRepository.save(Objects.requireNonNull(fromDto(discountCodeDto)));
return DiscountCodeDto.builder()
.id(discountCode.getId())
.startDate(discountCode.getStartDate())
.endDate(discountCode.getEndDate())
.code(discountCode.getCode())
.quantity(discountCode.getQuantity())
.rate(discountCode.getRate())
.status(discountCode.getStatus())
.build();
}
JUnit 5 с тестовым набором:
class DiscountCodeTest {
private DiscountCodeService discountCodeService;
private DiscountCodeRepository discountCodeRepository = mock(DiscountCodeRepository.class);
@BeforeEach
void setUp() {
discountCodeService = new DiscountCodeService(discountCodeRepository);
}
@AfterEach
void tearDown() {
reset(discountCodeRepository);
}
@Test
void shouldAddDiscountCode() {
// given
Long expectedDiscountCodeId = 1L;
DiscountCode expectedDiscountCode =
new DiscountCode(
expectedDiscountCodeId,
LocalDateTime.now().plusDays(1),
LocalDateTime.now().plusDays(5),
"7142",
null,
BigDecimal.valueOf(100),
DiscountCodeStatus.ACTIVE);
DiscountCodeDto givenDiscountCodeDto =
new DiscountCodeDto(
LocalDateTime.now().plusDays(1),
LocalDateTime.now().plusDays(5),
"7142",
BigDecimal.valueOf(100),
DiscountCodeStatus.ACTIVE);
when(discountCodeRepository.save(any())).thenReturn(expectedDiscountCode);
// when
DiscountCodeDto actualDiscountCode = discountCodeService.add(givenDiscountCodeDto);
// then
verify(discountCodeRepository).save(any(DiscountCode.class));
assertEquals(givenDiscountCodeDto, actualDiscountCode);
}
В настоящее время в каждом сценарии я получаю исключение NullPointerException для строки:
DiscountCodeDto actualDiscountCode = discountCodeService.add (GivenDiscountCodeDto);
в разделе теста JUnit. Все, что я хочу сделать, - это сохранить объект с использованием DTO без указания идентификатора объекта DTO.
Я пытался выполнить метод add с использованием Postman, но в этом случае я получаю исключение NullPointerException.
Заранее спасибо за любую помощь.