Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Ao incluir idCliente e idUsuario o response retornar vázio

AgendaControllerTest

package cabeleireiro.api.apiRest.controller;

import cabeleireiro.api.apiRest.domain.agenda.Agenda;
import cabeleireiro.api.apiRest.domain.agenda.DadosAgendamento;
import cabeleireiro.api.apiRest.domain.agenda.DadosDetalhamentoAgendamento;
import cabeleireiro.api.apiRest.domain.usuario.Usuario;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentMatchers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.json.JacksonTester;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import java.time.LocalDateTime;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.mock.http.server.reactive.MockServerHttpRequest.post;
import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureJsonTesters
class AgendaControllerTest {

    @Autowired
    private MockMvc mvc;

    @Autowired
    JacksonTester<DadosAgendamento> dadosAgendamentoJson;

    @Autowired
    JacksonTester<DadosDetalhamentoAgendamento> dadosDetalhamentoAgendamentoJson;

    @MockBean
    private Agenda agenda;

    @MockBean
    private Usuario usuario;

    @Test
    @DisplayName("Deveria devolver código http 400, quando informações estão inválidas")
    @WithMockUser
    void agendar_cenario2() throws Exception {

        var response = mvc.perform(MockMvcRequestBuilders.post("/agendas")).andReturn().getResponse();

        assertThat(response.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST.value());
    }

    @Test
    @DisplayName("Deveria devolver código http 200, quando informações estão válidas")
    @WithMockUser
    void agendar_cenario1() throws Exception {

        var data = LocalDateTime.now().plusHours(1);

        var dadosDetalhamento = new DadosDetalhamentoAgendamento(null, 3l, 2l, 1l, 1l, data, data.plusMinutes(30));

        var usuario = new Usuario(1l, "thiago", "123456");

        when(agenda.agendar(any(), ArgumentMatchers.eq(usuario))).thenReturn(dadosDetalhamento);

        var response = mvc.perform(MockMvcRequestBuilders.post("/agendas")
                .contentType(MediaType.APPLICATION_JSON)
                .content(dadosAgendamentoJson.write(
                        new DadosAgendamento(3l, 2l, 1l, data)
                ).getJson())
        )
        .andReturn().getResponse();

        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());

        var jsonEsperado = dadosDetalhamentoAgendamentoJson.write(
                dadosDetalhamento
        ).getJson();

        assertThat(response.getContentAsString()).isEqualTo(jsonEsperado);
    }


}
2 respostas
solução!

Oii Thiago, tudo bem?

Vendo o código que você compartilhou, acredito que a maneira como você configurou o when() pode não estar cobrindo o caso de teste específico que você está tentando executar.

No seu código, você tem:

when(agenda.agendar(any(), ArgumentMatchers.eq(usuario))).thenReturn(dadosDetalhamento);

Aqui, você está dizendo que, quando o método agendar() for chamado com qualquer argumento para o primeiro parâmetro e um objeto usuario específico para o segundo parâmetro, ele deve retornar dadosDetalhamento.

Mas, se o método agendar() for chamado com argumentos diferentes durante a execução do seu teste, o Mockito não saberá o que retornar, e por padrão, ele retorna null quando não há um comportamento definido. Isso pode ser a causa do seu problema, já que você está recebendo um JSON vazio como resposta.

Uma solução pra esse problema seria alterar a maneira como você tá configurando o when(). Em vez de especificar um objeto usuario específico, você pode usar any() para o segundo parâmetro, assim como você fez para o primeiro. Isso diria ao Mockito para retornar dadosDetalhamento sempre que o método agendar() for chamado, independentemente dos argumentos.

Assim:

when(agenda.agendar(any(), any())).thenReturn(dadosDetalhamento);

Espero que essa ideia te dê uma luz.

Um abraço e bons estudos.

Obrigado, era bem isso que faltava.