Entendendo Mock e MagicMock em Python

Este artigo foi escrito para qualquer pessoa entender (se teve algo que não entendeu me fale, para que possa melhorar), mesmo quem ainda está começando com testes em Python. Vamos explicar o que é cada conceito, por que ele existe e quando usar, sempre com exemplos práticos e explicações claras.


1. O que é Mock? (explicação simples)

Um Mock é um objeto falso, criado apenas para testes, que finge ser outro objeto real.

Ele permite:

Em vez de usar:

usamos um mock para simular esse comportamento.

Por que isso é importante?

Porque em testes nós queremos:

Exemplo mental

Imagine uma função que envia e-mails:

PYTHON
def send_email(to):
    print("Enviando email")
Clique para expandir e ver mais

Em um teste, você não quer enviar e-mails de verdade. Então você substitui essa função por um mock.

O mock:

👉 Por isso dizemos que o mock é flexível: você define como ele deve se comportar.

👉 Qualquer atributo acessado em um Mock vira automaticamente outro Mock.


2. O que é MagicMock?

MagicMock é um tipo especial e subclasse de Mock.

Ele existe para simular objetos que usam métodos mágicos do Python.

O que são métodos mágicos?

São métodos que:

Exemplos comuns:

Esses métodos não são chamados diretamente, mas pelo próprio Python.

Por que MagicMock existe?

O Mock normal não lida bem com esses métodos. O MagicMock já vem preparado para isso.


3. Mock ≠ Stub ≠ Fake (diferenças importantes)

Stub

Um stub apenas retorna valores fixos.

PYTHON
def get_user_stub():
    return {"id": 1}
Clique para expandir e ver mais

Fake

Um fake tem uma implementação simples, mas funcional.

PYTHON
class FakeEmailService:
    def __init__(self):
        self.sent = []

    def send(self, to):
        self.sent.append(to)
Clique para expandir e ver mais

Mock

Um mock registra chamadas e valida interações.

PYTHON
from unittest.mock import Mock

email = Mock()
email.send("a@test.com")
email.send.assert_called_once_with("a@test.com")
Clique para expandir e ver mais

4. Principais atributos e métodos

return_value

Define o valor retornado pelo mock.

PYTHON
mock.func.return_value = 10
Clique para expandir e ver mais

side_effect

Permite exceções, funções ou múltiplos retornos.

PYTHON
mock.func.side_effect = Exception("Erro")
Clique para expandir e ver mais

called / call_count

Indicam se e quantas vezes foi chamado.

PYTHON
assert mock.func.called
assert mock.func.call_count == 1
Clique para expandir e ver mais

call_args / call_args_list

Mostram os argumentos usados.

PYTHON
mock.func(1)
mock.func(2)

assert mock.func.call_args_list == [((1,),), ((2,),)]
Clique para expandir e ver mais

5. patch — substituindo dependências

Use patch para trocar dependências reais por mocks temporariamente.

A regra de ouro:

Você deve patchar onde o objeto é USADO, não onde é DEFINIDO.

PYTHON
# app/services.py
from app.email import send_email

def notify(user):
    send_email(user.email)
Clique para expandir e ver mais
PYTHON
with patch("app.services.send_email") as mock_send:
    notify(user)
Clique para expandir e ver mais

❌ ERRADO:

PYTHON
patch("app.email.send_email")
Clique para expandir e ver mais

6. spec e autospec

Use para evitar erros silenciosos e garantir assinatura correta.

spec

Restringe atributos válidos.

PYTHON
mock = Mock(spec=MyClass)
Clique para expandir e ver mais

autospec

Restringe atributos e assinatura.

PYTHON
@patch("module.func", autospec=True)
def test(mock_func):
    ...
Clique para expandir e ver mais

✅ Evita erros silenciosos.


7. Mock com lógica → use Fake

Se o mock contém lógica complexa, transforme-o em um fake.

8. Problemas comuns e como resolver

❌ Mock não funciona

➡️ Patch no lugar errado

❌ Teste passa mas quebra em produção

➡️ Falta de autospec

❌ Teste difícil de entender

➡️ Mocks demais

❌ Mock com lógica

➡️ Extraia para fake

9. Quando usar (e quando NÃO usar)

Use mocks quando:

NÃO use mocks quando:

Regra prática: mock dependências, não regras de negócio.

10. Boas práticas reais

11. Anti‑padrões

🚫 Mockar método privado
🚫 Mockar lógica de domínio
🚫 Testar apenas chamadas
🚫 Mocks aninhados em excesso


12. Checklist mental

Antes de criar um mock:


Referências

Copyright Notice

Link: https://alra.dev/pt/posts/entendendo-mock-e-magicmock-em-python/

Licença: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

Iniciar busca

Digite palavras-chave para buscar

↑↓
ESC
⌘K Atalho