Удаление списка объектов из хранилища с использованием Spring Data - PullRequest
0 голосов
/ 31 октября 2019

Я хочу создать метод, который будет удалять объекты VerificationToken из базы данных старше 30 минут. VerificationToken.class выглядит так:

@Builder
@AllArgsConstructor
class VerificationToken extends AbstractBaseEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(unique = true)
  private String value;

  @Column(unique = true)
  private String email;

  @CreatedDate private LocalDateTime created;

  VerificationToken() {}

  VerificationToken(String value, String email) {
    this.value = value;
    this.email = email;
  }

  public Long getId() {
    return id;
  }

  String getValue() {
    return value;
  }

  public String getEmail() {
    return email;
  }

  LocalDateTime getCreated() {
    return created;
  }
}

Я использую репозиторий Spring Data JPA как:

interface VerificationTokenRepository extends JpaRepository<VerificationToken, Long> {
  void deleteAllByCreatedLessThan(LocalDateTime localDateTime);
}

Мой сервис выглядит так:

@Service
@AllArgsConstructor
public class VerificationService {

  private VerificationTokenRepository verificationTokenRepository;

  void removeUnusedVerificationTokens(LocalDateTime localDateTime) {
    verificationTokenRepository.deleteAllByCreatedLessThan(localDateTime.minusMinutes(30));
  }

}

После этого короткогореализации, я хочу проверить это, как показано ниже:

@ExtendWith(MockitoExtension.class)
class VerificationServiceTest {

  @InjectMocks
  private VerificationService verificationService;

  @Mock
  private VerificationTokenRepository tokenRepository;


  @BeforeEach
  void setUp() {
    verificationService = new VerificationService(tokenRepository);
  }

  @Test
  void removeUnusedVerificationTokens() {

    //given
    given(tokenRepository.findAll()).willReturn(verificationTokenDataStab());
    //when
    verificationService.removeUnusedVerificationTokens(LocalDateTime.now().minusMinutes(30));
    //then
    assertAll(() -> assertEquals(tokenRepository.findAll().size(), 3));

  }

  List<VerificationToken> verificationTokenDataStab() {
    return
        List
            .of(
                VerificationToken.builder().created(LocalDateTime.now().minusMinutes(65)).build(),
                VerificationToken.builder().created(LocalDateTime.now().minusMinutes(22)).build(),
                VerificationToken.builder().created(LocalDateTime.now().minusMinutes(200)).build(),
                VerificationToken.builder().created(LocalDateTime.now().minusMinutes(90)).build(),
                VerificationToken.builder().created(LocalDateTime.now().minusMinutes(10)).build(),
                VerificationToken.builder().created(LocalDateTime.now().minusMinutes(5)).build(),
                VerificationToken.builder().created(LocalDateTime.now().minusMinutes(35)).build());
  }
}

Проблема в том, что в моем утверждении я ожидаю размер 3 после вызова метода removeUnusedVerificationTokens, но после того, как размер всей коллекции не изменился, и он все еще7.

Согласно документации, метод: void deleteAll() из CrudRepository

Удаляет все сущности, управляемые хранилищем

Так что я предполагаю, что deleteAll должно повлиять на всю коллекцию, но этого не произошло.

Казалось бы, метод должен работать правильно, но, в конце концов, тест не может это подтвердить. Я буду благодарен за предложения, как исправить вышеупомянутый запрос Spring Data для достижения цели.

1 Ответ

0 голосов
/ 01 ноября 2019

Здесь есть несколько проблем (однако нет никакой проблемы с самим методом запроса):

  1. Вы высмеиваете VerificationTokenRepository, а затем передаете этот фиктивный объект в конструкторVerificationService. Поэтому, когда вы вызываете метод removeUnusedVerificationTokens, он вызывает метод подложного объекта, который по умолчанию абсолютно ничего не делает .

  2. Вы определяете возвращаемое значение для следующеговызовите tokenRepository.findAll(), который возвращает список из 7 объектов, затем вы проверяете результат этого вызова. Конечно, он возвращает список из 7 объектов, это именно то, что вы определили тремя строками выше.

Я рекомендую вам прочитать несколько статей о Mockito и о том, как работают mock и mocked методы.

...