Qual a diferença entre mock e stub?
Enquanto um stub apenas provê respostas prontas para as chamadas que serão feitas durante o teste, o mock vai mais além e, além de prover as respostas, também valida as chamadas - ele conhece o comportamento esperado do sistema e testa este comportamento.
Assim, ao substituir um componente durante os testes, um stub teria a seguinte responsabilidade:
Se o teste invocar o método A, retorno B.
Se o teste invocar o método X, retorno Y.
Enquanto um mock teria a seguinte responsabilidade:
O teste deve invocar primeiro o método A, passando o valor 1 como parâmetro, daí retorno B.
O teste deve depois invocar o método X, passando o valor 2 como parâmetro, daí retorno Y.
Se o teste não seguir exatamente esta sequência, ele falha.
Então podemos colocar na lista de diferenças o fato de que um mock é mais complexo que um stub.
É comum desenvolvedores usarem frameworks de mocks (JMock, EasyMock, Mockito, ...) apenas como stubs (não validam a interação entre os testes e o componente "mockado"). Neste caso o framework é especializado em mocks, mas conceitualmente está sendo utilizado um stub e não um mock.
Também não é incomum desenvolvedores chamarem de "mock" todos os tipos de dublês. E não há nada de tão errado nisso desde que de coração você conheça as diferenças e a complexidade trazida por cada tipo.
Em quais situações usar um é mais vantajoso que usar o outro?
Estabelecido que ambos servem para substituir componentes reais (eles são "dublês" destes componentes) durante os testes, e entendida a diferença entre eles, fica nítido quando usar um e quando usar outro:
Use stub para testar se um código, dada uma determinada entrada (respostas prontas dos métodos do stub), produz determinada saída.
Use mockpara testar se um código se comporta da maneira esperada no que tange a interações com o componente que o mock está substituindo.
Um outro dublê na história:
Algumas vezes, além de prover respostas prontas, queremos saber se o teste de fato invocou um método do componente substiuído, ou mesmo quantas vezes ele invocou, mas não precisamos ser tão rígidos a ponto de verificar a sequência das chamadas ou o valor dos parâmetros, neste caso colocamos algum estado simples no stub (contador de chamadas do método, por exemplo) e obtemos assim um spy - um outro tipo de dublê que fica entre o stub e o mock, com alguns benefícios do segundo e quase toda a simplicidade do primeiro.
Usamos os diferentes tipos de dublês conforme a necessidade dos nossos testes, e damos preferência aos tipos menos complexos pois são menos acoplados ao código de produção, mais claros para serem entendidos, mais fáceis de receber manutenção.
O WavingTest é uma aplicação para automação de testes com Inteligência Artificial pensada para times ágeis usarem na sua rotina. Com ele, você tem:
Aumento da Cobertura dos Testes
Maior grau de recrutamento das funcionalidades com mais diversidade de cenários a serem submetidos os testes, gerando maior confiabilidade geral do processo
Mais Confiabilidade dos Testes
Utilização de automações e inteligência artificial, eliminando os riscos e as vulnerabilidades contidas na execução dos testes manuais
Aumento da Velocidade das Entregas
Automatizações que reduzem o tempo do time gasto com atividades manuais e operacionais sem agregação e aumentam o ritmo geral de entrega da solução proporcionando rápidos feedbacks
Comments