Para fazer testes simples, zombar da camada de acesso ao banco de dados é perfeitamente aceitável. Você chama getName()
, chama o DAO que foi ridicularizado e retorna "John" para o primeiro nome e "Smith" para o sobrenome, os reúne e tudo é perfeito. Não há necessidade de testar um banco de dados na unidade.
As coisas se tornam um pouco mais quando a lógica se torna um pouco mais complexa. E se você tivesse um método "createOrUpdateUser (...)". Se você zombou do banco de dados, pode verificar se um determinado método foi chamado uma vez com um determinado parâmetro quando o zombador não retorna objetos e um método diferente é chamado no banco de dados quando retorna um objeto existente. Isso começa a chegar a essa linha difusa, onde pode ser mais fácil (especialmente se já estiver lá) criar um banco de dados especializado em memória e testar esse código com dados pré-configurados.
Em algum código real em que trabalhei (ponto de vendas), tínhamos um resumeSuspededTransaction(...)
método. Isso puxaria a transação do banco de dados para um objeto (e seus componentes) e atualizaria o banco de dados. Tínhamos zombado e um bug espreitava o código em algum lugar com a serialização e desserialização dos dados indo para o banco de dados (alteramos um tipo que era serializado de maneira diferente no banco de dados).
O mock não nos mostrou o bug porque estava retornando seu caminho feliz - serialize a transação, armazene-o no mock, desserialize-o do mock, teste se eles são iguais. No entanto, quando você serializa um objeto com um zero à esquerda no banco de dados, ele é descartado e, em seguida, recombinado de volta a uma sequência sem os zeros. Detectamos o bug sem o banco de dados através da solução de problemas (não foi tão difícil de detectar quando soubemos que ele estava lá).
Posteriormente, colocamos um banco de dados e percebemos que o bug nunca teria passado por esse teste de junção se estivéssemos indo para um banco de dados na memória.
Na memória, os bancos de dados têm as vantagens:
- eles podem ser acelerados rapidamente (sem a necessidade de um DBA para configurar contas, tabelas e outros) para teste
- os dados podem ser pré-configurados para esse teste
- o teste não precisa se preocupar em reverter o teste quando terminar
- cada teste possui seu próprio banco de dados de memória, para que você não precise se preocupar se dois testes estiverem sendo executados simultaneamente
- eles podem ser executados em sistemas que não têm conectividade com os bancos de dados reais