40.3.8 自动配置的Data JPA测试

你可以使用@DataJpaTest测试JPA应用,它默认配置一个内存型的内嵌数据库,扫描@Entity类,并配置Spring Data JPA仓库,其他常规的@Component beans不会加载进ApplicationContext

Data JPA测试类是事务型的,默认在每个测试结束后回滚,具体查看Spring参考文档的相关章节。如果这不是你想要的结果,可以通过禁用事务管理器来改变:

  1. import org.junit.Test;
  2. import org.junit.runner.RunWith;
  3. import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
  4. import org.springframework.test.context.junit4.SpringRunner;
  5. import org.springframework.transaction.annotation.Propagation;
  6. import org.springframework.transaction.annotation.Transactional;
  7. @RunWith(SpringRunner.class)
  8. @DataJpaTest
  9. @Transactional(propagation = Propagation.NOT_SUPPORTED)
  10. public class ExampleNonTransactionalTests {
  11. }

Data JPA测试类可能会注入一个专为测试设计的[TestEntityManager](https://github.com/spring-projects/spring-boot/tree/v1.4.1.RELEASE/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/TestEntityManager.java) bean以替换标准的JPA EntityManager。如果想在@DataJpaTests外使用TestEntityManager,你可以使用@AutoConfigureTestEntityManager注解。如果需要,JdbcTemplate也是可用的。

  1. import org.junit.*;
  2. import org.junit.runner.*;
  3. import org.springframework.boot.test.autoconfigure.orm.jpa.*;
  4. import static org.assertj.core.api.Assertions.*;
  5. @RunWith(SpringRunner.class)
  6. @DataJpaTest
  7. public class ExampleRepositoryTests {
  8. @Autowired
  9. private TestEntityManager entityManager;
  10. @Autowired
  11. private UserRepository repository;
  12. @Test
  13. public void testExample() throws Exception {
  14. this.entityManager.persist(new User("sboot", "1234"));
  15. User user = this.repository.findByUsername("sboot");
  16. assertThat(user.getUsername()).isEqualTo("sboot");
  17. assertThat(user.getVin()).isEqualTo("1234");
  18. }
  19. }

对于测试来说,内存型的内嵌数据库通常是足够的,因为它们既快又不需要任何安装。如果比较喜欢在真实数据库上运行测试,你可以使用@AutoConfigureTestDatabase注解:

  1. @RunWith(SpringRunner.class)
  2. @DataJpaTest
  3. @AutoConfigureTestDatabase(replace=Replace.NONE)
  4. public class ExampleRepositoryTests {
  5. // ...
  6. }

附录中可以查看@DataJpaTest开启的自动配置列表。