java - 在 BDDMockito 的 Spring 测试中,当 jpaRepository.save() 时不执行任何操作

标签 java spring springmockito

我现在正在我的应用程序中应用测试,但我不希望它填充我的数据库,我已经研究了使用不同数据库的方法,但还没有找到简单的方法。但我发现了 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

我发现 save 不是一个 void 方法,但我不知道我能做什么,除非覆盖我的存储库的所有保存。

最佳答案

只需像平常一样模拟保存方法即可。

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

您不能对非 void 方法执行doNothing,因为它必须返回一些内容。您可以返回 null、空对象或其他内容。这取决于您的代码的作用以及您需要测试执行的操作。

可能需要额外的配置,例如排除您的存储库配置类,但这可能会导致其他问题。

或者,只需让它写入数据库即可。像这样的测试通常只是一个嵌入式数据库,所以我不确定允许写入有什么问题。如果持久化数据导致问题,只需在每次测试运行后清除数据库,或者在持久化实体时更加明智,这样您的测试就不会互相干扰。您可以在 @After (JUnit 4) 或 @AfterEach (JUnit 5) 方法中清除数据库。

@PersistenceContext
protected EntityManager em;

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

关于java - 在 BDDMockito 的 Spring 测试中,当 jpaRepository.save() 时不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60992854/

相关文章:

java - 直接使用 HashCode 访问 HashSet? ( java )

java - 什么是 "SocketTimeoutException connect time out"以及如何修复它?

java - java中的缓存

java - ApsectJ 在添加 @Transactional 注释时抛出异常

java - 我们可以在java中将任何字符串日期值转换为日期yyyy-MM-dd吗?

java - 如何在 Spring JPA Web 应用程序中设置一些 Hibernate 属性?

java - 使用 appengine-maven-plugin 在 Eclipse 中的本地 DevAppServer 上使用 GAE HTTPS

java - org.hamcrest.Matcher 的方法 equalTo() 返回这样的值 <<value>>

spring-boot - 如何在@WebMvcTest 的服务层上模拟 beans Autowired

mockito - Spring 批处理作业的端到端测试用例