A maioria das equipes sabe como simular (mock) uma API. O ponto crítico é decidir quando isso realmente ajuda e quando vira apenas mais uma camada de manutenção. Uma simulação usada no momento certo remove gargalos reais; uma simulação criada por hábito se distancia da produção e passa a validar uma ficção.
Este guia foca no “quando” e em como aplicar mocks de forma prática: desenvolver frontend e backend em paralelo, exercitar caminhos de erro, substituir serviços de terceiros instáveis, preparar demonstrações e manter o CI rápido e previsível.
Desenvolvimento paralelo de frontend e backend
Este é o caso clássico. O frontend precisa consumir um endpoint que o backend ainda não entregou. Sem mock, a equipe de frontend espera ou implementa com base em suposições que podem quebrar no primeiro contato com o serviço real.
A abordagem mais segura é começar pelo contrato:
- Defina o contrato da API em uma especificação compartilhada, como OpenAPI.
- Gere ou configure o mock a partir desse contrato.
- Faça o frontend consumir o mock usando a mesma estrutura esperada da API real.
- Quando o backend estiver pronto, troque apenas a URL base.
- Valide se backend e frontend continuam aderentes ao contrato.
Exemplo de separação por ambiente:
const API_BASE_URL =
process.env.NODE_ENV === "development"
? "https://mock.example.com"
: "https://api.example.com";
const response = await fetch(`${API_BASE_URL}/orders`);
const orders = await response.json();
O ponto essencial é que o mock não deve ser inventado apenas pelo frontend. Ele precisa refletir um contrato compartilhado. Esse é o mesmo princípio por trás do teste de contrato de API: as equipes concordam primeiro no formato, depois cada lado implementa sua parte.
O benefício aparece ao longo do projeto. O frontend não fica bloqueado, o backend evita interrupções por endpoints parcialmente prontos, e produto e design conseguem validar uma versão clicável mais cedo. O custo de manutenção permanece baixo quando o mock é gerado a partir da especificação, em vez de escrito manualmente.
Testando caminhos de erro que você não pode acionar sob demanda
Uma API saudável tende a retornar 200. O problema é que seu cliente também precisa lidar com 429, 500, 503, payloads inválidos e timeouts. Um servidor real funcionando corretamente não vai produzir esses cenários sempre que seus testes precisarem.
Mocks permitem forçar essas respostas de forma controlada.
Exemplos de cenários úteis:
| Falha a testar | Configuração da simulação | O que prova |
|---|---|---|
| Erro do servidor | Retornar 500
|
Cliente tenta novamente e degrada graciosamente |
| Limitação de taxa | Retornar 429 com Retry-After
|
Cliente respeita o intervalo correto |
| Rede lenta | Atrasar a resposta em 5s | Cliente trata timeout corretamente |
| Payload inválido | Retornar JSON quebrado | Parser falha sem derrubar a aplicação |
Exemplo de teste de retry:
async function fetchWithRetry(url: string, retries = 2) {
for (let attempt = 0; attempt <= retries; attempt++) {
const response = await fetch(url);
if (response.ok) {
return response.json();
}
if (attempt === retries) {
throw new Error(`Request failed with status ${response.status}`);
}
}
}
Com um mock, você pode configurar a primeira resposta como 500 e a segunda como 200, verificando se o retry realmente acontece.
Este é um dos usos mais importantes de simulação. Tratamento de erro não exercitado é tratamento de erro não validado. Combine mocks com asserções de API para garantir que cada caminho de falha foi testado, não apenas assumido.
Também vale simular respostas HTTP válidas, mas inválidas para o domínio:
-
200com preço negativo. - Pedido com status fora do enum esperado.
- Lista paginada com cursor
nextquebrado. - Campo obrigatório ausente.
- Tipo incorreto em uma propriedade.
Um servidor real correto nunca deveria enviar isso. Um mock pode enviar esses casos deliberadamente para revelar suposições escondidas no seu código de parsing.
Substituindo uma API de terceiros
Chamar um processador de pagamento real, serviço de mapas ou API de envio dentro da suíte de testes pode ser lento, caro e instável. Além disso, você depende de um sistema que não controla. Se o sandbox do fornecedor cair, seus testes também caem.
A solução prática é simular a API de terceiros:
- Registre respostas reais uma vez ou use o esquema publicado pelo fornecedor.
- Configure um mock com os principais cenários de sucesso e erro.
- Execute seus testes automatizados contra esse mock.
- Mantenha uma verificação agendada contra o serviço real para detectar mudanças.
Exemplo de configuração por ambiente:
THIRD_PARTY_API_URL=https://mock-payments.example.com
No código:
const paymentApiUrl = process.env.THIRD_PARTY_API_URL;
await fetch(`${paymentApiUrl}/charges`, {
method: "POST",
body: JSON.stringify({
amount: 4990,
currency: "BRL",
}),
});
Isso torna os testes mais rápidos, gratuitos e determinísticos. Eles continuam funcionando mesmo se o fornecedor tiver uma interrupção.
O cuidado necessário é manter o mock atualizado. O terceiro pode alterar a API sem aviso. Para reduzir esse risco, execute um job agendado que chama o serviço real e valida se a resposta ainda corresponde ao formato esperado pelo mock. Essa verificação de contrato deve ser pequena, isolada e separada da suíte principal.
Também vale acompanhar o changelog do fornecedor para detectar mudanças planejadas antes que um teste de contrato falhe.
Alimentando demonstrações e protótipos
Uma demonstração que chama serviços reais na frente de um cliente é uma aposta. Uma consulta lenta, uma resposta vazia ou uma indisponibilidade temporária podem comprometer uma apresentação.
Mocks tornam a demonstração determinística. Você define exatamente quais dados serão retornados:
- Um pedido que chega no prazo.
- Um dashboard com métricas coerentes.
- Uma busca com resultados limpos.
- Um fluxo de aprovação sem dados inesperados.
- Um usuário com permissões específicas.
O objetivo aqui não é testar. É controlar a experiência.
Para protótipos, o mock permite validar um fluxo de UI antes de qualquer backend existir. A equipe consegue construir telas, testar navegação e coletar feedback sem esperar pela API real.
Exemplo simples de resposta mockada para um dashboard:
{
"revenue": 128450,
"orders": 342,
"conversionRate": 4.8,
"status": "healthy"
}
Ferramentas dessa categoria são comparadas neste artigo sobre ferramentas de simulação de API online.
Um mock de protótipo também pode funcionar como documento de design. Se ele retorna os mesmos formatos que a API final deverá servir, o código de frontend escrito contra ele não precisa ser descartável. Quando o backend honrar o mesmo contrato, a troca pode se limitar à URL base.
Mantendo o CI rápido e estável
Uma suíte de testes que chama serviços externos no CI herda todos os problemas desses serviços:
- Falhas de rede.
- Rate limits.
- Sandboxes instáveis.
- Dados de staging compartilhados.
- Builds concorrentes alterando o mesmo estado.
Cada um desses pontos pode gerar falhas intermitentes que não têm relação com o código em revisão.
Mocks tornam a suíte mais hermética. Cada execução começa do mesmo estado, evita ida e volta pela rede e falha apenas quando o código testado realmente quebra.
Uma estratégia prática:
- Use mocks na suíte executada a cada commit.
- Mantenha os testes rápidos e determinísticos.
- Execute uma suíte menor de contrato contra APIs reais em um agendamento.
- Use essa suíte agendada para validar se os mocks continuam fiéis à produção.
Exemplo de divisão no pipeline:
name: tests
on:
pull_request:
push:
jobs:
unit-and-component-tests:
runs-on: ubuntu-latest
env:
API_BASE_URL: https://mock-api.example.com
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
E uma verificação separada para contrato:
name: contract-tests
on:
schedule:
- cron: "0 */6 * * *"
jobs:
contract-tests:
runs-on: ubuntu-latest
env:
API_BASE_URL: https://api.example.com
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run test:contract
Essa separação é central para um pipeline de testes CI/CD saudável.
O ganho de velocidade não é apenas conveniência. Uma suíte que cai de doze minutos para noventa segundos muda o comportamento da equipe. Desenvolvedores rodam os testes antes do push, revisores recebem feedback mais rápido, e falhas passam a ser levadas a sério.
Quando não simular
Mocks têm um modo de falha claro: ficarem diferentes da realidade. Quando isso acontece, os testes continuam verdes enquanto produção quebra.
Evite simular quando o objetivo do teste é validar a integração real. Testes de contrato e ponta a ponta existem para verificar o limite real entre sistemas. Se você simula esse limite, remove o propósito do teste.
Também evite mocks quando:
- A dependência real é rápida, gratuita e confiável no ambiente de teste.
- Você nunca valida o mock contra a API real.
- O comportamento testado depende de detalhes reais da infraestrutura.
- O custo de manter o mock é maior do que chamar o serviço real.
A regra prática é:
- Simule para velocidade, isolamento e controle.
- Teste contra a realidade para confirmar que os mocks continuam verdadeiros.
Se você quiser manter simulação e verificação de contrato no mesmo fluxo, o Apidog gera mocks a partir do design da sua API e executa testes tanto contra a simulação quanto contra o endpoint real. Para configurar isso, baixe o Apidog e comece com sua especificação existente. Para a base conceitual, veja o que é uma API simulada.
Perguntas frequentes
Quando devo simular uma API em vez de chamar a real?
Simule quando você precisa de velocidade, isolamento ou controle. Os principais casos são desenvolvimento paralelo contra um backend inacabado, testes de caminhos de erro, substituição de serviços de terceiros lentos ou pagos, demonstrações previsíveis e CI estável.
Chame a API real para testes de contrato, integração e ponta a ponta.
A simulação substitui os testes de integração?
Não. Simulação é mais útil em testes de unidade, componentes e fluxos controlados. Testes de integração e contrato devem atingir o limite real, porque o objetivo deles é confirmar que o serviço real corresponde ao contrato.
Como evito que uma simulação fique desatualizada?
Gere o mock a partir de um esquema compartilhado, como OpenAPI. Depois, execute testes de contrato agendados contra a API real para confirmar que a resposta em produção continua compatível com o esquema.
Posso simular uma API de terceiros que não controlo?
Sim. Esse é um dos melhores usos de mocks. Registre respostas reais ou use o esquema publicado pelo fornecedor, teste contra o mock no dia a dia e mantenha uma verificação agendada contra o serviço real para detectar mudanças.
A simulação é útil para demonstrações e protótipos?
Sim. Em demonstrações, mocks tornam os dados previsíveis e evitam falhas causadas por serviços externos. Em protótipos, permitem validar fluxos de UI antes do backend existir.
Top comments (0)