NullPointerException при сохранении сущности с использованием dto - PullRequest
0 голосов
/ 13 апреля 2019

сегодня у меня проблема с моим частным проектом. Хотя сущность сохраняется с использованием 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.

Заранее спасибо за любую помощь.

...