Oi, Luidi!
Gostei da sua linha de raciocinio e ela faz sentido, mas o ajuste importante é este: mock e caixa branca não são sinônimos.
Quando você faz mock de Usuario.prototype.salvar, realmente existe um componente de caixa branca, porque você precisou conhecer um detalhe interno da implementação do cadastrarUsuario: o fato de que ele chama salvar.
Mas isso não significa que todo teste com mock seja automaticamente caixa branca no sentido completo. O ponto central é:
tipo de teste responde o que está sendo isolado
caixa branca / caixa preta responde quanto da implementação interna o teste conhece
Então são duas classificações diferentes que podem se misturar.
No seu caso:
1. Se o teste chama cadastrarUsuario e deixa salvar real acessar banco, ele é teste de integração, porque depende da persistência real.
2. Se o teste chama cadastrarUsuario e mocka salvar, ele passa a ser teste unitário, porque a unidade cadastrarUsuario ficou isolada do banco.
3. Dentro desse teste unitário, se você mockou salvar sabendo que ele existe internamente, então esse teste tem um aspecto de caixa branca.
Ou seja, neste cenário, a classificação mais correta seria:
teste unitário com conhecimento de implementação interna
O que talvez esteja gerando a confusão é imaginar que um teste precisa ser ou unitário ou caixa branca. Na prática, ele pode ser:
unitário + caixa branca
unitário + caixa preta
integração + caixa preta
integração + caixa branca
O que muda é o critério analisado.
Neste ponto, a resposta direta para sua pergunta é:
sim, quando você mocka uma dependência interna específica que só descobriu olhando a implementação, existe sim um elemento de caixa branca.
Você percebeu corretamente isso.
Mas tem um detalhe importante: o mock não obriga o teste a ser caixa branca em qualquer nível. Isso depende do quanto o teste se acopla aos detalhes internos.
Exemplo:
- Se você mocka exatamente
Usuario.prototype.salvar porque viu esse método dentro do código, isso é mais próximo de caixa branca. - Se o código fosse estruturado para receber uma dependência externa, como um
usuarioRepository, e o teste mockasse esse contrato externo, o teste continuaria sendo unitário, mas com menos acoplamento à implementação.
A diferença está no desenho do código.
No formato atual do seu método, para isolar o teste sem bater no banco, você realmente precisa conhecer que existem dependências internas como:
Usuario.pegarPeloEmailusuario.salvarbcryptjs.hash
Então, neste código específico, o teste unitário tende mesmo a ter um lado de caixa branca.
O resumo mais seguro é este:
Você está certo em dizer que, para mockar uma dependência interna, normalmente é necessário conhecer a implementação.
Mas a conclusão correta não é “mock = caixa branca sempre”. A conclusão correta é: mock pode introduzir caixa branca, enquanto o fato de o teste ser unitário depende de ele isolar ou não a unidade das dependências reais.
Fico à disposição!