spring-projects / spring-boot

Spring Boot
https://spring.io/projects/spring-boot
Apache License 2.0
74.91k stars 40.62k forks source link

@MockBean in abstract Class #15969

Closed JoseRFJuniorLLMs closed 5 years ago

JoseRFJuniorLLMs commented 5 years ago

Good night ! When I use Mock it works when I use MockBean it does not work, somebody has some idea ... Thanks since. I have 3 classes.

@Entity
@Table(name = "pessoa", schema = "public")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Pessoa implements Serializable {
@Entity
@Table(name = "fisica", schema = "public")
@PrimaryKeyJoinColumn(name = "fkpessoa")
public class Fisica extends Pessoa implements Serializable {
@Entity
@Table(name = "juridica", schema = "public", uniqueConstraints = {@UniqueConstraint(columnNames = {"cnpj", "inscest"})})
@PrimaryKeyJoinColumn(name = "fkpessoa")
public class Juridica extends Pessoa implements Serializable {
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.BDDMockito;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import java.time.LocalDate;
import java.time.Month;
import java.util.ArrayList;
import java.util.List;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@ActiveProfiles("test")
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@AutoConfigureMockMvc
public class PessoaResourceTest {

    // Endpoint
    private static final String URL_BASE = "/pessoa/";
    // Pessoa
    private static final Long PESSOA_ID = 1L;
    private static final String FISICA_NOMERAZAO = "Eduarda Simone Jesus";
    private static final boolean PESSOA_ATIVO = true;
    private static final String PESSOA_OBS = "OBS";
    private static final boolean PESSOA_EMAILAUTO = true;
    private static final boolean PESSOA_ISENTOICMS = true;
    // Fisica
    private static final String FISICA_CPF = "612.620.058-68";
    private static final String FISICA_RG = "38.452.247-6";
    private static final String FISICA_SEXO = Sexo.FEMININO.getValor();
    private static final LocalDate FISICA_NASCIMENTO = LocalDate.of(1998, Month.APRIL, 11);
    private static final String FISICA_PAI = "Priscila Simone";
    private static final String FISICA_MAE = "Calebe Augusto Jesus";
    // Juridica
    private static final String JURIDICA_NOMERAZAO = "Bárbara e Giovanna Esportes ME";
    private static final String JURIDICA_FANTASIA = "Bárbara e Giovanna Esportes ME";
    private static final String JURIDICA_CNPJ = "42.765.656/0001-45";
    private static final String JURIDICA_INSCEST = "526.160.231.117";
    // Estado Civil
    private static final Integer ESTADOCIVIL_ID = 1;
    private static final String ESTADOCIVIL_DESCRICAO = "Solteiro";
    // Endereco
    private static final Long ENDERECO_ID = 1L;
    private static final String ENDERECO_TIPO = "Residencia";
    private static final String ENDERECO_CEP = "11680-971";
    private static final String ENDERECO_BAIRRO = "Centro";
    private static final String ENDERECO_NUMERO = "246";
    private static final String ENDERECO_COMPLEMENTO = "Casa 1";
    private static final String ENDERECO_REFERENCIA = "Proximo ao bar do Manoel";
    private static final String ENDERECO_LOGRADOURO = "Avenida Rio Grande do Sul 725";
    private static final boolean ENDERECO_PADRAO = true;
    // Cidade
    private static final Integer CIDADE_ID = 3555406;
    private static final String CIDADE_DESCRICAO = "Ubatuba";
    private static final String CIDADE_UF = "SP";
    // Pais
    private static final Integer PAIS_ID = 1050;
    private static final String PAIS_DESCRICAO = "Brasil";
    // Telefone
    private static final Long TELEFONE_ID = 1L;
    private static final String TELEFONE_DESCRICAO = "Residencia";
    private static final String TELEFONE_TELEFONE = "(12) 3919-5701";
    private static final boolean TELEFONE_PADRAO = false;
    // Celular
    private static final Long CELULAR_ID = 2L;
    private static final String CELULAR_DESCRICAO = "Celular";
    private static final String CELULAR_TELEFONE = "(12) 99388-6574";
    private static final boolean CELULAR_PADRAO = true;
    // E-mail
    private static final Long ENDERECOVIRTUAL_ID = 1L;
    private static final String ENDERECOVIRTUAL_TIPO = "E-mail";
    private static final String ENDERECOVIRTUAL_DESCRICAO = "eeduardaelisaninajesus@pp33.com.br";
    private static final boolean ENDERECOVIRTUAL_PADRAO = true;

    @Autowired
    private MockMvc mvc;

    @MockBean
    private PessoaService pessoaService;

    @MockBean
    private EstadoCivilService estadoCivilService;

    @MockBean
    private CidadeService cidadeService;

    @MockBean
    private PaisService paisService;

    @Test
    @WithMockUser
    public void testIncluirPessoaFisica() throws Exception {
        Fisica pessoaFisica = obterDadosPessoaFisica();
        BDDMockito.given(this.pessoaService.salvar(Mockito.any(Fisica.class))).willReturn(pessoaFisica);

        mvc.perform(MockMvcRequestBuilders.post(URL_BASE)
                .content(this.obterJsonRequisicaoPostFisica())
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isCreated())
                .andExpect(header().exists("location"));
    }

    @Test
    @WithMockUser
    public void testIncluirPessoaJuridica() throws Exception {
        Juridica juridica = obterDadosPessoaJuridica();
        BDDMockito.given(this.pessoaService.salvar(Mockito.any(Fisica.class))).willReturn(juridica);

        mvc.perform(MockMvcRequestBuilders.post(URL_BASE)
                .content(this.obterJsonRequisicaoPostJuridica())
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isCreated())
                .andExpect(header().exists("location"));
    }

    private String obterJsonRequisicaoPostFisica() throws JsonProcessingException {
        FisicaDTO fisicaDTO = FisicaDTO.FisicaDTOBuilder
                .aFisicaDTO()
                .comNomeRazao(FISICA_NOMERAZAO)
                .comAtivo(PESSOA_ATIVO)
                .comObs(PESSOA_OBS)
                .comEmailAuto(PESSOA_EMAILAUTO)
                .comIsentoicms(PESSOA_ISENTOICMS)
                .comCpf(FISICA_CPF)
                .comRg(FISICA_RG)
                .comSexo(Sexo.parse(FISICA_SEXO))
                .comNascimento(FISICA_NASCIMENTO)
                .comPai(FISICA_PAI)
                .comMae(FISICA_MAE)
                .comEstadoCivil(buildEstadoCivilDTO())
                .comEnderecos(buildEnderecosDTO())
                .comEnderecosVirtuais(buildEnderecosVirtuaisDTO())
                .comTelefones(buildTelefonesDTO())
                .build();

        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(fisicaDTO);
    }

    private List<TelefoneDTO> buildTelefonesDTO() {
        List<TelefoneDTO> telefones = new ArrayList<>();
        telefones.add(TelefoneDTO.TelefoneDTOBuilder
                .oTelefoneDTO()
                .comId(TELEFONE_ID)
                .comDescricao(TELEFONE_DESCRICAO)
                .comTelefone(TELEFONE_TELEFONE)
                .comPadrao(TELEFONE_PADRAO)
                .build());

        telefones.add(TelefoneDTO.TelefoneDTOBuilder
                .oTelefoneDTO()
                .comId(CELULAR_ID)
                .comDescricao(CELULAR_DESCRICAO)
                .comTelefone(CELULAR_TELEFONE)
                .comPadrao(CELULAR_PADRAO)
                .build());
        return telefones;
    }

    private List<EnderecoVirtualDTO> buildEnderecosVirtuaisDTO() {
        List<EnderecoVirtualDTO> enderecoVirtuais = new ArrayList<>();
        enderecoVirtuais.add(EnderecoVirtualDTO.EnderecoVirtualDTOBuilder
                .oEnderecoVirtualDTO()
                .comId(ENDERECOVIRTUAL_ID)
                .comTipo(ENDERECOVIRTUAL_TIPO)
                .comDescricao(ENDERECOVIRTUAL_DESCRICAO)
                .comPadrao(ENDERECOVIRTUAL_PADRAO).build());
        return enderecoVirtuais;
    }

    private List<EnderecoDTO> buildEnderecosDTO() {
        List<EnderecoDTO> enderecos = new ArrayList<>();
        enderecos.add(EnderecoDTO.EnderecoDTOBuilder
                .oEnderecoDTO()
                .comId(ENDERECO_ID)
                .comTipo(ENDERECO_TIPO)
                .comCep(ENDERECO_CEP)
                .comBairro(ENDERECO_BAIRRO)
                .comNumero(ENDERECO_NUMERO)
                .comComplemento(ENDERECO_COMPLEMENTO)
                .comReferencia(ENDERECO_REFERENCIA)
                .comLogradouro(ENDERECO_LOGRADOURO)
                .comPadrao(ENDERECO_PADRAO)
                .comCidade(buildCidadeDTO())
                .comPais(buildPaisDTO())
                .build());
        return enderecos;
    }

    private PaisDTO buildPaisDTO() {
        return PaisDTO.PaisDTOBuilder
                .oPaisDTO()
                .comId(PAIS_ID)
                .comDescricao(PAIS_DESCRICAO)
                .build();
    }

    private CidadeDTO buildCidadeDTO() {
        return CidadeDTO.CidadeDTOBuilder
                .aCidadeDTO()
                .comId(CIDADE_ID)
                .comDescricao(CIDADE_DESCRICAO)
                .comUf(CIDADE_UF)
                .build();
    }

    private EstadoCivilDTO buildEstadoCivilDTO() {
        return EstadoCivilDTO.EstadoCivilDTOBuilder
                .oEstadoCivilDTO()
                .comId(ESTADOCIVIL_ID)
                .comDescricao(ESTADOCIVIL_DESCRICAO)
                .build();
    }

    private Fisica obterDadosPessoaFisica() {
        return Fisica.FisicaBuilder
                .aFisica()
                .comId(PESSOA_ID)
                .comNomeRazao(FISICA_NOMERAZAO)
                .comAtivo(PESSOA_ATIVO)
                .comObs(PESSOA_OBS)
                .comEmailAuto(PESSOA_EMAILAUTO)
                .comIsentoicms(PESSOA_ISENTOICMS)
                .comEstadoCivil(buildEstadoCivil())
                .comEnderecos(buildEnderecos())
                .comEnderecosVirtuais(buildEnderecosVirtuais())
                .comTelefones(buildTelefones())
                .comCpf(FISICA_CPF)
                .comRg(FISICA_RG)
                .comSexo(Sexo.parse(FISICA_SEXO))
                .comNascimento(FISICA_NASCIMENTO)
                .comPai(FISICA_PAI)
                .comMae(FISICA_MAE)
                .build();
    }

    private List<EnderecoVirtual> buildEnderecosVirtuais() {
        List<EnderecoVirtual> enderecoVirtuais = new ArrayList<>();
        enderecoVirtuais.add(EnderecoVirtual.EnderecoVirtualBuilder
                .oEnderecoVirtual()
                .comId(ENDERECOVIRTUAL_ID)
                .comTipo(ENDERECOVIRTUAL_TIPO)
                .comDescricao(ENDERECOVIRTUAL_DESCRICAO)
                .comPadrao(ENDERECOVIRTUAL_PADRAO).build());
        return enderecoVirtuais;
    }

    private List<Telefone> buildTelefones() {
        List<Telefone> telefones = new ArrayList<>();
        telefones.add(Telefone.TelefoneBuilder
                .oTelefone()
                .comId(TELEFONE_ID)
                .comDescricao(TELEFONE_DESCRICAO)
                .comTelefone(TELEFONE_TELEFONE)
                .comPadrao(TELEFONE_PADRAO)
                .build());

        telefones.add(Telefone.TelefoneBuilder
                .oTelefone()
                .comId(CELULAR_ID)
                .comDescricao(CELULAR_DESCRICAO)
                .comTelefone(CELULAR_TELEFONE)
                .comPadrao(CELULAR_PADRAO)
                .build());
        return telefones;
    }

    private List<Endereco> buildEnderecos() {
        List<Endereco> enderecos = new ArrayList<>();
        enderecos.add(Endereco.EnderecoBuilder
                .oEndereco()
                .comId(ENDERECO_ID)
                .comTipo(ENDERECO_TIPO)
                .comCep(ENDERECO_CEP)
                .comBairro(ENDERECO_BAIRRO)
                .comNumero(ENDERECO_NUMERO)
                .comComplemento(ENDERECO_COMPLEMENTO)
                .comReferencia(ENDERECO_REFERENCIA)
                .comLogradouro(ENDERECO_LOGRADOURO)
                .comPadrao(ENDERECO_PADRAO)
                .comCidade(buildCidade())
                .comPais(buildPais())
                .build());
        return enderecos;
    }

    private Pais buildPais() {
        return paisService.salvar(Pais.PaisBuilder
                .oPais()
                .comId(PAIS_ID)
                .comDescricao(PAIS_DESCRICAO)
                .build());
    }

    private Cidade buildCidade() {
        return cidadeService.salvar(Cidade.CidadeBuilder
                .aCidade()
                .comId(CIDADE_ID)
                .comDescricao(CIDADE_DESCRICAO)
                .comUf(CIDADE_UF)
                .build());
    }

    private EstadoCivil buildEstadoCivil() {
        return estadoCivilService.salvar(EstadoCivil.EstadoCivilBuilder
                .oEstadoCivil()
                .comId(ESTADOCIVIL_ID)
                .comDescricao(ESTADOCIVIL_DESCRICAO)
                .build());
    }

    private String obterJsonRequisicaoPostJuridica() throws JsonProcessingException {
        JuridicaDTO juridicaDTO = JuridicaDTO.JuridicaDTOBuilder
                .aJuridicaDTO()
                .comNomeRazao(JURIDICA_NOMERAZAO)
                .comAtivo(PESSOA_ATIVO)
                .comObs(PESSOA_OBS)
                .comEmailAuto(PESSOA_EMAILAUTO)
                .comIsentoicms(PESSOA_ISENTOICMS)
                .comEnderecos(buildEnderecosDTO())
                .comEnderecosVirtuais(buildEnderecosVirtuaisDTO())
                .comTelefones(buildTelefonesDTO())
                .comCnpj(JURIDICA_CNPJ)
                .comFantasia(JURIDICA_FANTASIA)
                .comInscest(JURIDICA_INSCEST)
                .build();

        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(juridicaDTO);
    }

    private Juridica obterDadosPessoaJuridica() {
        return Juridica.JuridicaBuilder
                .aJuridica()
                .comId(PESSOA_ID)
                .comNomeRazao(FISICA_NOMERAZAO)
                .comAtivo(PESSOA_ATIVO)
                .comObs(PESSOA_OBS)
                .comEmailAuto(PESSOA_EMAILAUTO)
                .comFantasia(FISICA_NOMERAZAO)
                .build();
    }
}
wilkinsona commented 5 years ago

Thanks for the report. Unfortunately it’s not clear to me what the problem is. “Does not work” doesn’t tell us very much. What behaviour did you expect and how did that differ from what occurred? Also, the issue title describes using @MockBean in an abstract class but the class that you are using it in is not abstract.

If you would like us to spend some time trying to help you, please spend some time accurately describing the problem. Please also take the time to provide a minimal and complete sample (as a zip attached to this issue or a separate Git repository).

spring-projects-issues commented 5 years ago

If you would like us to look at this issue, please provide the requested information. If the information is not provided within the next 7 days this issue will be closed.

JoseRFJuniorLLMs commented 5 years ago

Thanks. We changed the design to NodeJS.