【问题标题】:Including only individual entities in Spring Boot JPA Test在 Spring Boot JPA 测试中仅包括单个实体
【发布时间】:2016-08-23 19:34:02
【问题描述】:
我正在尝试在单独的项目实体中测试 jpa 查询,方法是快速启动一个 Spring Boot 项目以生成一个平台以将数据插入 H2 数据库、对其运行查询并验证这些查询的结果。
由于单独的项目有一个庞大的实体库,我想有选择地挑选出我想要每次测试的实体。
我已尝试为此使用@EntityScan 注释,但它似乎旨在提取整个包,即使您只是指定一个类。
这让我觉得必须有解决方案,但到目前为止我一直找不到它。
【问题讨论】:
标签:
java
spring
testing
spring-boot
spring-data-jpa
【解决方案1】:
问题是,当您使用 Spring 上下文设置测试类时,该类中的所有测试都存在该上下文,除非您使用 @DirtiesContext 或其他一些技巧来使其自行重建。
@EntityScan(basePackageClasses = MyEntity.class)
上面的代码并没有告诉 Spring 使用 MyEntity,它告诉它开始搜索包中存在 MyEntity 的实体。它也递归地这样做,所以如果你有:
com.example.entities.MyEntity
com.example.entities.subpackage.MyOtherEntity
它会同时接收MyEntity 和 MyOtherEntity。但是,如果您这样写 EntityScan:
@EntityScan(basePackageClasses = MyOtherEntity.class)
那么MyEntity 将找不到。
考虑到这一点,我对您的唯一建议可能是将您的大量实体分组到多个较小的子包中以使其更容易加载,如果一次加载所有实体确实对您来说是一个阻碍的话。
【解决方案2】:
所以,我想出了一个使用 Hibernate 特定代码的解决方案。 Hibernate SessionFactoryBeans 有一个 addAnnotatedClass 方法,所以如果你在配置文件中创建一个 LocalSessionFactoryBean bean,你可以只传入你想要的各个类。如果你有一点创意,你可以在你的测试类中添加你想要测试的类(我还有一个 DependencyGrapher,它让我知道我需要引入的所有实体类)作为 @TestPropertySource's 并在集合中引用这些值上代码。
如果您使用 Hibernate,这实际上很容易,但不幸的是,我无法做到。我被限制使用 EclipseLink,它似乎并没有提供开箱即用的功能。不过,我认为我在 Spring 的 PersistenceUnitPostProcessor 方面处于领先地位。