Skip to content

Usa 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 vs TestContainers

Nesse exemplo simples, temos uma atualizacã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 aplicacao 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

Published inJava

Be First to Comment

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *