Neste artigo apresento um exemplo de uso de Mock Objects em .NET 7, tomando como base um projeto criado originalmente em versões anteriores do .NET e detalhado em um artigo publicado há algum tempo no meu blog:
Testes de Software com .NET 5: exemplos de utilização
A implementação em questão utilizou o Moq como alternativa para a manipulação de Mock Objects, além de se basear no xUnit e empregar ainda o framework Fluent Assertions. Já disponibilizei inclusive este exemplo no GitHub:
https://github.com/renatogroffe/DotNet7-Moq-xUnit-FluentAssertions_AnaliseCredito
Caso achem útil esta solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!
Partindo da interface IServicoConsultaCredito:

E do enum StatusConsultaCredito e da classe Pendencia, construções utilizadas pela interface IServicoConsultaCredito:
Teremos o uso dessas estruturas pela classe AnaliseCredito:

E como poderíamos então gerar um objeto por meio da interface IServicoConsultaCredito, sem que contemos com uma implementação da mesma?
A resposta está no uso da classe genérica Mock (namespace Moq), disponibilizada pelo Moq para a criação de Mock Objects. A listagem seguinte exemplifica tudo isso, com a configuração de mapeamentos no construtor do tipo TestesAnaliseCredito e o uso de um Mock Object simulando as condições possíveis a serem tratadas por AnaliseCredito:
| using Moq; |
| using FluentAssertions; |
| namespace ConsultaCredito.Testes; |
| public class TestesAnaliseCredito |
| { |
| private readonly Mock<IServicoConsultaCredito> mock; |
| private const string CPF_INVALIDO = “123A”; |
| private const string CPF_ERRO_COMUNICACAO = “76217486300”; |
| private const string CPF_SEM_PENDENCIAS = “60487583752”; |
| private const string CPF_INADIMPLENTE = “82226651209”; |
| public TestesAnaliseCredito() |
| { |
| mock = new(MockBehavior.Strict); |
| mock.Setup(s => s.ConsultarPendenciasPorCPF(CPF_INVALIDO)) |
| .Returns(() => null); |
| mock.Setup(s => s.ConsultarPendenciasPorCPF(CPF_ERRO_COMUNICACAO)) |
| .Throws(exception: new(“Testando erro de comunicacao”)); |
| mock.Setup(s => s.ConsultarPendenciasPorCPF(CPF_SEM_PENDENCIAS)) |
| .Returns(() => new List<Pendencia>()); |
| var pendencias = new List<Pendencia>() |
| { |
| new () |
| { |
| CPF = CPF_INADIMPLENTE, |
| NomePessoa = “Cliente Teste”, |
| NomeReclamante = “Empresas ACME”, |
| DescricaoPendencia = “Parcela nao paga”, |
| VlPendencia = 900.50 |
| } |
| }; |
| mock.Setup(s => s.ConsultarPendenciasPorCPF(CPF_INADIMPLENTE)) |
| .Returns(() => pendencias); |
| } |
| private StatusConsultaCredito ObterStatusAnaliseCredito(string cpf) |
| { |
| AnaliseCredito analise = new(mock.Object); |
| return analise.ConsultarSituacaoCPF(cpf); |
| } |
| [Fact] |
| [Trait(“CPF Invalido”, “Simular”)] |
| public void TestarCPFInvalidoMoq() |
| { |
| StatusConsultaCredito status = |
| ObterStatusAnaliseCredito(CPF_INVALIDO); |
| status.Should().Be(StatusConsultaCredito.ParametroEnvioInvalido, |
| “Resultado incorreto para um CPF invalido”); |
| } |
| [Fact] |
| [Trait(“Erro Comunicacao”, “Simular”)] |
| public void TestarErroComunicacaoMoq() |
| { |
| StatusConsultaCredito status = |
| ObterStatusAnaliseCredito(CPF_ERRO_COMUNICACAO); |
| status.Should().Be(StatusConsultaCredito.ErroComunicacao, |
| “Resultado incorreto para um erro de comunicacao”); |
| } |
| [Fact] |
| [Trait(“Sem Pendencias”, “Simular”)] |
| public void TestarCPFSemPendenciasMoq() |
| { |
| StatusConsultaCredito status = |
| ObterStatusAnaliseCredito(CPF_SEM_PENDENCIAS); |
| status.Should().Be(StatusConsultaCredito.SemPendencias, |
| “Resultado incorreto para um CPF sem pendencias”); |
| } |
| [Fact] |
| [Trait(“Inadimplente”, “Simular”)] |
| public void TestarCPFInadimplenteMoq() |
| { |
| StatusConsultaCredito status = |
| ObterStatusAnaliseCredito(CPF_INADIMPLENTE); |
| status.Should().Be(StatusConsultaCredito.Inadimplente, |
| “Resultado incorreto para um CPF inadimplente”); |
| } |
| } |
Esse exemplo foi apresentado em detalhes em uma live recente no Microsoft Reactor, com o conteúdo podendo ser assistido gratuitamente no YouTube:
*O conteúdo deste artigo é de responsabilidade do(a) autor(a) e não reflete necessariamente a opinião do iMasters.




