isso existe desde 1900 e guaraná com rolha na integração entre sistemas.
quando alguem desenvolve um sistema que acessa um banco de dados, vc tem exatamente este problema ( afinal vc não tem acesso ao codigo do driver do banco ou ao banco em si, nem acesso ao codigo do browser que vc esta usando, nem o codigo da pilha tcp/ip, etc )
o que vc precisa é definir a interface entre os modulos e ter uma implementação de referencia do mesmo.
um bom exemplo são:
I. sistemas que interagem via interface REST.
imagine dois sistemas, A e B, onde A conecta em B e pede algo via GET ( simples )
agora imagine um projeto chamado ReferenciaB ( vamos chamar de RB ) onde tanto A quanto B dependem para os testes.
A vai usar RB para simular uma serie de requests ( quando retorna sucesso, quando retorna fracasso, etc )
B vai usar RB para testar se a dada serie de requests realmente retorna o esperado.
II. sistemas baseados em especificação
nesse caso B pode não fornecer RB mas ele fornece uma documentação e vc implementa os testes baseado no documento.
III. sistemas baseados em especificação com acesso ao codigo compilado
uma vez eu implementei um cliente para Riak ( banco de dados NoSQL ) usando a API Protocol Buffers.
meus testes unitarios foram baseados na especificação ( se o tipo do request for x, retorna esses bytes )
e tinha testes funcionais onde eu realmente usava uma versão REAL do Riak, enviando e lendo bytes.
nesse caso eu não tinha acesso ao codigo. e nem precisava pq a minha interface era a API Publica, eu tinha especificação e eu tinha como fazer testes com o meu alvo.
ok dei exemplos de HTTP/Sockets mas uma API publica entre modulos segue o mesmo principio. se vc usa bons principios de injeção de dependencias vc pode mockar o resto do codigo que vc não tem.
portanto vc tem opções:
-
nada impede que os testes do codigo de um modulo use, por exemplo, o .jar de outro modulo, em uma fase de testes de integração
-
nada impede que seja criados testes que verifiquem a integração de cada modulo isolado
-
nada impede de juntar tudo e rodar uma bateria de testes ( se o sistema é grande, vc pode rodar nightly tests quando vc pega tudo o que ja foi feito naquele dia e roda junto durante a noite ).
Perceba que vc pode ter um build ok mas um codigo que não funciona pq não integra direito. Afinal um build é diferente de uma release.
O que vc quer é uma release adequada. e pra isso vc precisa de testes unitarios e de integração. não tem almoço gratis.