I have a side project were I'm using Spring Boot, Liquibase and Postgres.
I have the following sequence of tests:
test1();
test2();
test3();
test4();
In those four tests I'm creating the same entity. As I'm not removing the records from the table after each test case, I'm getting the following exception: org.springframework.dao.DataIntegrityViolationException
I want to solve this problem with the following constraints:
@repository
to clean the database.In short: How can I remove the records from one or more tables after each test case without 1) using the @repository
of each entity and 2) killing and starting the database container on each test case?
The simplest way I found to do this was the following:
@Autowired
private JdbcTemplate jdbcTemplate;
JdbcTestUtils.deleteFromTables(jdbcTemplate, "table1", "table2", "table3");
@After
or @AfterEach
in your test class:@AfterEach
void tearDown() throws DatabaseException {
JdbcTestUtils.deleteFromTables(jdbcTemplate, "table1", "table2", "table3");
}
I found this approach in this blog post: Easy Integration Testing With Testcontainers
Annotate your test class with @DataJpaTest
. From the documentation:
By default, tests annotated with @DataJpaTest are transactional and roll back at the end of each test. They also use an embedded in-memory database (replacing any explicit or usually auto-configured DataSource).
For example using Junit4:
@RunWith(SpringRunner.class)
@DataJpaTest
public class MyTest {
//...
}
Using Junit5:
@DataJpaTest
public class MyTest {
//...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With