Spring Boot JPA Test Splice

Here is a small example that:

  • Uses @DataJpaTest annotation to bring in only configuration relevant for JPA tests (entities, repos etc…)
  • Uses @TestMethodOrder(MethodOrderer.OrderAnnotation.class) and @Order annotations to enforce order of method execution
  • Uses @ComponentScan(basePackages = {“tech.dimitar.rosdjpaint.bootstrap”}) annotation to bring in the component that bootstraps the data
  • Uses @Commit annotation on test to enforce transaction does not roll back after test is done (which is the default behavior)
...

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@DataJpaTest
@ComponentScan(basePackages = {"tech.dimitar.rosdjpaint.bootstrap"}) //Scan package that contains command line runner that inits the data
public class SpringBootJpaTestSplice {

    @Autowired
    BookRepository bookRepository;

    //@Rollback(value = false)
    @Commit
    @Order(1)
    @Test
    void testJpaTestSplice() {
        final long countBefore = bookRepository.count();
        assertThat(countBefore).isEqualTo(2L);

        bookRepository.save(new Book("Test Book", "1234", "Self Publishing"));

        final long countAfter = bookRepository.count();
        assertThat(countBefore).isLessThan(countAfter);
    }

    @Order(2)
    @Test
    void testJpaTestSpliceTransaction() {
        final long countBefore = bookRepository.count();
        assertThat(countBefore).isEqualTo(3L);
    }
}