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?
X1está dizendo que Ximplementa interface X1. Se você alterar a interface X1para X2a 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 Anão deve depender dos detalhes da implementação (que é o que você mudaria nesse caso). Portanto, os testes de unidade Aainda estão corretos e eles informam que Afunciona, dada a implementação ideal da interface.