H2 nos seus testes de integração ? Esse post é pra você!
Muitas vezes, optamos por usar H2 como base de dados para provas de conceito, testes rápidos e, algumas vezes, testes de integração.
Nesse post, vou te mostrar que há uma solução mais confiável e tão simples quanto o H2, o TestContainers.
Mas o que é H2 ?
Ele é uma base dados relacional escrita em Java que salva seus registros em memória, ou seja, ao ser encerrado, seus dados são descartados. É possível persistir esses dados, mas fica para um próximo post.
O que é TestContainers ?
Nada mais é do que uma biblioteca que suporta testes do JUnit e que disponibiliza vários recursos através de imagens do Docker.
H2 versus TestContainers
Nesse exemplo simples, temos uma atualização de status de um cartão de crédito dado o nome de um cliente:
@Modifying(clearAutomatically = true)
@Query(value = "UPDATE CreditCard c SET c.active = ? WHERE c.name = ?",nativeQuery = true)
void updateActiveStatus(boolean active, String name)
E testamos esse código através do teste abaixo:
@Transactional
@Test
void should_block_credit_card() {
insertCreditCards();
creditCardRepository.updateActiveStatus(false, "Seya");
CreditCard seyaCreditCard = creditCardRepository.findById(1l).orElseThrow();
assertTrue(seyaCreditCard.getName().equals("Seya"));
assertFalse(seyaCreditCard.isActive());
}
Ao executar usando o H2, o teste passa com sucesso. Porém ao executar com o TestContainers usando uma imagem real do Postgresql, o teste dá o seguinte erro:
org.hibernate.exception.SQLGrammarException: could not execute statement
Esse erro ocorre pois o Postgresql não permite alias na cláusula SET. Se retirarmos, o teste é validado com sucesso:
@Modifying(clearAutomatically = true)
@Query(value = "UPDATE CreditCard c SET active = ? WHERE c.name = ?", nativeQuery = true)
void updateActiveStatus(boolean active, String name);
Conclusão
O H2 é uma excelente ferramenta, mas no exemplo ele acabaria ocultando um erro do código que só seria possível ver com a aplicação rodando localmente ou no próprio servidor.
Sempre opte por utilizar recursos o mais próximo possível da sua infraestrutura e o TestContainers está aí para nos ajudar.
Links
- Repositório do exemplo (Nele há três branches, cada uma com o cenário de H2 e Postgresql com sucesso e erro).
- TestContainers
- H2 Database