Ничего не делать, когда jpaRepository.save () в весенних тестах с BDDMockito - PullRequest
0 голосов
/ 02 апреля 2020

Я сейчас применяю тесты в своем приложении, но я не хочу, чтобы оно заполняло мою базу данных, я искал способы использования другой базы данных, но не нашел простого способа сделать это. Но я нашел BDDMockito, который помогает мне контролировать то, что произойдет, когда я вызываю мой jpaRepository.

Я пытался использовать BDDMockito с методом .doNothing, но, кажется, невозможно использовать с jpaRepository.save (), это мой код:

public void postColaborador(String sobreNome, String rg, String cpf, String orgaoExpedidor, String nomePai, String nomeMae,
                            LocalDate dataNascimento, String estadoCivil, String tipoCasamento, PessoaFisica conjuge,
                            String profissao, String matricula, String nome, String escopo, Endereco endereco, String secretaria,
                            String idCriador) throws JsonProcessingException {

    Colaborador colaborador = new Colaborador(sobreNome, rg, cpf, orgaoExpedidor, nomePai, nomeMae, dataNascimento,
            estadoCivil, tipoCasamento, conjuge, profissao, matricula);
    colaborador.setNome(nome);
    colaborador.setEscopo(escopo);
    colaborador.setEndereco(endereco);

    BDDMockito.doNothing().when(colaboradorRepository).save(colaborador); //this should make jpa do nothing when I call method save

    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:" + port + "/api/colaborador/cadastrar")
            .queryParam("colaborador", objectMapper.writeValueAsString(colaborador))
            .queryParam("setor", secretaria)
            .queryParam("idCriador", idCriador);

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<String> entity = new HttpEntity<>(headers);

    ResponseEntity<String> response = testRestTemplate.exchange(
            builder.build().encode().toUri(),
            HttpMethod.POST,
            entity,
            String.class);
    Assertions.assertEquals(HttpStatus.OK, response.getStatusCode());
}

Когда я выполняю тест, я получаю эту ошибку:

org.mockito.exceptions.base.MockitoException:  Only void methods can doNothing()! Example of correct use of doNothing():
    doNothing().
    doThrow(new RuntimeException())
    .when(mock).someVoidMethod(); Above means: someVoidMethod() does nothing the 1st time but throws an exception the 2nd time is called

Я вижу, что сохранение не является пустым методом, но я не знаю, что Я могу сделать, если не перезаписать все мои сохранения моих репозиториев.

1 Ответ

1 голос
/ 02 апреля 2020

Просто смоделируйте метод сохранения, как обычно.

when(colaboradorRepository.save()).thenReturn(something);

Вы не можете doNothing для не пустого метода, потому что он должен что-то возвращать. Вы можете вернуть null, пустой объект или что-то еще. Это зависит от того, что делает ваш код и для чего нужен тест.

Может потребоваться дополнительная настройка, например исключение класса конфигурации хранилища, но это может вызвать другие проблемы.

В качестве альтернативы, просто дайте ему записать в базу данных. Подобные тесты обычно представляют собой просто встроенную базу данных, поэтому я не уверен, что не так с разрешением записи. Если постоянные данные вызывают проблемы, просто очищайте базу данных после каждого запуска теста или будьте более осторожны при сохранении ваших сущностей, чтобы ваши тесты не наступали друг на друга. Вы можете очистить базу данных в ваших @After (JUnit 4) или @AfterEach (JUnit 5) методах.

@PersistenceContext
protected EntityManager em;

@AfterEach
void clearDb() {
  em.createQuery("DELETE FROM MyJpaClass").executeUpdate();
}
...