У меня есть простая реализация репозитория, подобная этой.
@Repository
public interface PolicyRepository extends ReactiveMongoRepository<Policy, String> {
@Query("{ id: { $exists: true }}")
Flux<Policy> findAllPaged(Pageable pageable);
@Query("{ name: { $eq: ?0 }}")
Mono<Policy> findByName(String name);
}
И простой метод действия на контроллере, подобный этому.
@ResponseStatus(HttpStatus.CREATED)
public Mono<ResponseEntity<String>> createPolicy(@Valid @RequestBody Policy policy) {
//Use The Mongodb ID Generator
policy.setId(ObjectId.get().toString());
return policyRepository.findByName(policy.getName()).flatMap(policy1 -> {
return Mono.just(ResponseEntity.badRequest().body("A Policy with the same name as the policy you are trying to create" +
"already exists"));
}).switchIfEmpty(
policyRepository.save(policy).map(p2 ->{
eventPublisher.publish(Events.POLICY_CREATED, p2.getId());
return ResponseEntity.status(HttpStatus.CREATED).body("Policy definition created successfully");
}));
}
То, чего я хотел добиться, это вернутьневерный запрос, если существует политика с тем же именем, что и вставляемая, или выполните операцию сохранения, если метод findByName возвращает пустое значение.
Странное поведение состоит в том, что следующий тест завершается неудачно, потому что всегда вызывается save независимо от того, возвращает ли findByName данные или нет.
Вот этот тест
@Test
void testCreateDuplicatePolicyShouldFail() {
given(policyRepository.findByName(eq(policy.getName()))).willReturn(Mono.just(policy));
given(policyRepository.save(any(Policy.class))).willReturn(Mono.just(policy));
given(eventPublisher.publish(Events.POLICY_CREATED, policy.getId())).willReturn(Mono.just(0L));
webTestClient.post().uri("/policies")
.syncBody(policy)
.exchange()
.expectStatus().isBadRequest();
verify(policyRepository, times(1)).findByName(eq(policy.getName()));
verify(policyRepository, times(0)).save(any(Policy.class));
verify(eventPublisher, times(0)).publish(Events.POLICY_CREATED, policy.getId());
}
И этопроисходит сбой со следующим исключением
org.mockito.exceptions.verification.NeverWantedButInvoked:
com.management.dashboard.repository.PolicyRepository#0 bean.save(
<any com.management.core.model.Policy>
);
Пожалуйста, я делаю что-то не так.Любой указатель будет высоко оценен.