Um exemplo de caso de falha que você prefere capturar é que o objeto em teste usa uma camada de cache, mas falha em manter os dados conforme necessário. Então, se você consultar o objeto, ele dirá "sim, eu tenho o novo nome e endereço", mas você deseja que o teste falhe porque ele não fez o que deveria.
Como alternativa (e negligenciando a violação de responsabilidade única), suponha que seja necessário persistir uma versão codificada em UTF-8 da sequência em um campo orientado a bytes, mas na verdade persiste o Shift JIS. Algum outro componente vai ler o banco de dados e espera ver UTF-8, daí o requisito. Em seguida, a viagem de ida e volta por esse objeto relatará o nome e o endereço corretos, pois o converterá novamente no Shift JIS, mas o erro não foi detectado pelo seu teste. Esperamos que seja detectado por algum teste de integração posterior, mas o objetivo principal dos testes de unidade é detectar problemas mais cedo e saber exatamente qual componente é responsável.
Se um deles não estiver fazendo o que deveria, seu próprio caso de teste falhará e podemos corrigi-lo e executar a bateria de teste novamente.
Você não pode assumir isso, porque se você não for cuidadoso, escreva um conjunto de testes mutuamente dependentes. O "salva?" test chama o método save de teste e, em seguida, o método load para confirmar que ele foi salvo. O "ele carrega?" test chama o método save para configurar o equipamento de teste e, em seguida, o método load está testando para verificar o resultado. Ambos os testes contam com a exatidão do método que não estão testando, o que significa que nenhum deles realmente testa a exatidão do método que está testando.
A pista de que há um problema aqui é que dois testes que supostamente estão testando unidades diferentes realmente fazem a mesma coisa . Ambos chamam um setter seguido por um getter e depois verificam se o resultado é o valor original. Mas você queria testar se o setter persiste nos dados, não que o par setter / getter funcione juntos. Para que você saiba que algo está errado, basta descobrir o que e corrigir os testes.
Se o seu código foi bem projetado para teste de unidade, há pelo menos duas maneiras de testar se os dados foram realmente mantidos corretamente pelo método em teste:
zombe da interface do banco de dados e faça com que seu registro zombe do fato de que as funções apropriadas foram chamadas nela, com os valores esperados. Isso testa o método faz o que deveria e é o teste de unidade clássico.
transmita a ele um banco de dados real com exatamente a mesma intenção , para registrar se os dados foram ou não mantidos corretamente. Mas, em vez de ter uma função falsa que apenas diz "sim, eu obtive os dados corretos", seu teste é lido diretamente diretamente no banco de dados e confirma que está correto. Este pode não ser o teste mais puro possível, porque um mecanismo de banco de dados inteiro é uma coisa muito importante para escrever uma simulação glorificada, com mais chances de eu ignorar alguma sutileza que faz um teste passar, mesmo que algo esteja errado (por exemplo, eu não deve usar a mesma conexão com o banco de dados para ler como foi usada para escrever, porque talvez eu veja uma transação não confirmada). Mas ele testa a coisa certa e, pelo menos, você sabe que precisamente implementa toda a interface do banco de dados sem precisar escrever nenhum código falso!
Portanto, é um mero detalhe da implementação do teste se eu leio os dados do banco de dados de teste pelo JDBC ou se eu zoo o banco de dados. De qualquer maneira, o ponto é que eu posso testar a unidade melhor isolando-a do que posso, se eu permitir que ela conspire com outros métodos incorretos da mesma classe para parecer correta, mesmo quando algo está errado. Portanto, quero usar qualquer meio conveniente para verificar se os dados corretos foram mantidos, além de confiar no componente cujo método estou testando.
Se o seu código não for bem projetado para teste de unidade, talvez você não tenha escolha, porque o objeto cujo método você deseja testar pode não aceitar o banco de dados como uma dependência injetada. Nesse caso, a discussão sobre a melhor maneira de isolar a unidade em teste muda para uma discussão sobre o quão perto é possível chegar ao isolamento da unidade em teste. A conclusão é a mesma, no entanto. Se você pode evitar conspirações entre unidades defeituosas, o faz, sujeito ao tempo disponível e a qualquer outra coisa que você pense que seria mais eficaz para encontrar falhas no código.