Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Método de teste salvando adoção no banco

O código exibido na aula (vide trecho abaixo) está acessando a API e persistindo os dados no banco.

@Test
void deveriaDevolverCodigo200ParaSolicitacaoDeAdocaoSemErros() throws Exception {
    //ARRANGE
    String json = """
            {
                "idPet": 1,
                "idTutor": 1,
                "motivo": "Motivo qualquer"
            }
            """;

    //ACT
    var response = mvc.perform(
            post("/adocoes")
                    .content(json)
                    .contentType(MediaType.APPLICATION_JSON)
    ).andReturn().getResponse();

    //ASSERT
    Assertions.assertEquals(200, response.getStatus());
}

Fiz algumas alterações (vide código abaixo) para que o teste acesse o endpoint, no entanto não persista os dados no banco

    @Test
    void deveriaDevolverCodigo200ParaSolicitacaoDeAdocaoSemErros() throws Exception {	
        String json = """
                {
                        "idPet": 1,
                        "idTutor": 1,
                        "motivo": "Motivo qualquer"
                }""";
        
        BDDMockito.doNothing().when(adocaoService).solicitar(new SolicitacaoAdocaoDto(null, null, ""));

        var response = mvc.perform(MockMvcRequestBuilders.post("/adocoes").content(json).contentType(MediaType.APPLICATION_JSON)).andReturn().getResponse();

        Assertions.assertEquals(200, response.getStatus());
    }

Gostaria de saber se as alterações que fiz estão corretas.

1 resposta
solução!

Olá, Rafael! Tudo bem?

Pelo que entendi, você alterou o método de teste para que ele não persista os dados no banco, certo? Para isso, você utilizou o método doNothing().when(adocaoService).solicitar(new SolicitacaoAdocaoDto(null, null, "")); do Mockito.

A sua abordagem está correta, mas tem um detalhe importante: você está passando um novo objeto SolicitacaoAdocaoDto com todos os campos nulos para o método solicitar(). Isso significa que o Mockito vai interceptar a chamada do método solicitar() apenas quando ele for chamado com um SolicitacaoAdocaoDto com todos os campos nulos.

No entanto, no seu teste, você está enviando um JSON com idPet e idTutor preenchidos, o que significa que o SolicitacaoAdocaoDto passado para o método solicitar() não terá todos os campos nulos. Portanto, o Mockito não vai interceptar essa chamada e o método solicitar() vai ser chamado normalmente, possivelmente persistindo os dados no banco.

Para resolver isso, você pode usar o método any() do Mockito no lugar do new SolicitacaoAdocaoDto(null, null, ""). O any() vai fazer com que o Mockito intercepte a chamada do método solicitar() independente do SolicitacaoAdocaoDto que for passado para ele. A alteração ficaria assim:

BDDMockito.doNothing().when(adocaoService).solicitar(Mockito.any(SolicitacaoAdocaoDto.class));

Dessa forma, o método solicitar() não será chamado, independente do SolicitacaoAdocaoDto que for passado para ele, e os dados não serão persistidos no banco.

Espero ter ajudado e bons estudos!