Você tem uma classe X e escreve alguns testes de unidade que verificam o comportamento X1. Há também a classe A, que toma X como uma dependência.
Ao escrever testes de unidade para A, você zomba de X. Em outras palavras, durante o teste de unidade A, você define (postula) que o comportamento da zombaria de X é X1. O tempo passa, as pessoas usam seu sistema, precisam mudar, X evolui: você modifica X para mostrar o comportamento X2. Obviamente, os testes de unidade do X falharão e você precisará adaptá-los.
Mas o que com A? Os testes de unidade para A não falharão quando o comportamento de X for modificado (devido à zombaria de X). Como detectar que o resultado de A será diferente quando executado com o X "real" (modificado)?
Estou esperando respostas ao longo da linha de: "Esse não é o objetivo do teste de unidade", mas que valor tem então o teste de unidade? Isso realmente apenas lhe diz que, quando todos os testes passam, você não introduziu uma mudança de quebra? E quando o comportamento de alguma classe muda (de boa ou má vontade), como você pode detectar (de preferência de forma automatizada) todas as consequências? Não devemos nos concentrar mais nos testes de integração?
X1
está dizendo que X
implementa interface X1
. Se você alterar a interface X1
para X2
a simulação que você usou nos outros testes não deverá mais compilar, portanto, você será forçado a corrigir esses testes também. Mudanças no comportamento da classe não devem importar. De fato, sua classe A
não deve depender dos detalhes da implementação (que é o que você mudaria nesse caso). Portanto, os testes de unidade A
ainda estão corretos e eles informam que A
funciona, dada a implementação ideal da interface.