我试图在JUnit测试中多次使用JPA / EclipseLink(2.5.1)来删除和创建表,方法是在多次createEntityManager
实例化上调用EntityManagerFactory
。但是,架构仅被删除/创建一次。如何让EclipseLink每次都删除/创建模式?
我的最终目标是让每个测试的db表处于已知状态(即空)。有没有更好的方法呢?
答案 0 :(得分:2)
使用EclipseLink,我使用了
properties.put("eclipselink.ddl-generation", "drop-and-create-tables");
properties.put("eclipselink.ddl-generation.output-mode", "database");
properties.put("eclipselink.deploy-on-startup", "true");
然后
JpaHelper.getEntityManagerFactory(em).refreshMetadata(properties);
这将删除并重新创建持久性单元中所有实体的表。正如其他地方所提到的,多次调用这种方法很昂贵 - 最好使用JPA批量删除查询在测试之前/之后清除数据:
"DELETE from EntityName entity"
答案 1 :(得分:1)
在每次测试运行时重新创建架构会大大减慢测试速度。您只需要确保您的数据处于“已知状态”,在您的情况下所有表都为空。所以:
在标记为“仅回滚”的事务中运行测试,以便数据库在每次执行后返回到已知状态。
和/或
查看DBUnit,您可以使用它在每次测试运行之前将数据库置于已知状态。
http://dbunit.sourceforge.net/index.html
或
答案 2 :(得分:0)
对于您的应用程序可能有点过分,但我使用Liquibase来处理数据库模式和表内容的版本控制。为JUnit代码绑定前/后挂钩应该很简单。