When you write unit tests for A, you mock X. In other words, while unit testing A, you set (postulate) the behaviour of X's mock to be X1. Time goes by, people do use your system, needs change, X evolves: you modify X to show behaviour X2. Obviously, unit tests for X will fail and you will need to adapt them.
Woah, espere um momento. As implicações dos testes para a falha do X são importantes demais para encobrir isso.
Se a alteração da implementação de X de X1 para X2 interromper os testes de unidade para X, isso indica que você fez uma alteração incompatível com versões anteriores do contrato X.
X2 não é um X, no Liskov sentido , então você deve estar pensando sobre outras maneiras de atender às necessidades de seus interessados (como a introdução de uma nova especificação Y, implementada por X2).
Para insights mais profundos, veja Pieter Hinjens: O fim das versões de software , ou Rich Hickey Simples Made Easy .
Do ponto de vista de A, há uma condição prévia de que o colaborador respeita o contrato X. E sua observação é efetivamente que o teste isolado para A não lhe dá nenhuma garantia de que A reconhece colaboradores que violam o contrato X.
Revise Testes integrados são uma farsa ; em alto nível, espera-se que você tenha tantos testes isolados quanto precisar para garantir que o X2 implemente o contrato X corretamente, e tantos testes isolados quantos forem necessários para garantir que A faça a coisa certa com respostas interessantes de um X, e um número menor de testes integrados para garantir que X2 e A concordem com o que X significa.
Às vezes, você verá essa distinção como teste solitário vs sociable
tests ; veja Jay Fields Trabalhando efetivamente com testes unitários .
Shouldn't we focus more on integration testing?
Mais uma vez, ver testes integrados são uma fraude - Rainsberger descreve em detalhes um ciclo de feedback positivo que é comum (em suas experiências) a projetos que estão confiando em testes integrados (com notas ortográficas). Em resumo, sem os testes isolados / solitários aplicando pressão ao projeto , a qualidade se degrada, levando a mais erros e testes mais integrados ...
Você também precisará de (alguns) testes de integração. Além da complexidade introduzida por múltiplos módulos, a execução desses testes tende a ter mais arrasto do que os testes isolados; é mais eficiente fazer iterações em verificações muito rápidas quando o trabalho está em andamento, salvando as verificações adicionais para quando você acha que está "pronto".