你可以:
- 有几个持久性单元
- 有几个persistence.xml并在测试时复制它们,稍后恢复它们
- 在测试中设置您自己的属性,并使用 mockito 返回您的自定义实体管理器工厂
- 使用弹簧:https ://www.baeldung.com/spring-testing-separate-data-source
前两个选项是所有建议问题中讨论最多的选项,也是迄今为止我最不喜欢的选项。
解决方案 3. 看起来像这样:
private EntityManager entityManager;
private static EntityManagerFactory entityManagerFactory;
@BeforeClass
public static void mainTestInitClass() {
Properties pros = new Properties();
// Override production properties
pros.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
pros.setProperty("hibernate.connection.driver_class", "org.h2.Driver");
pros.setProperty("hibernate.connection.username", "sa");
pros.setProperty("hibernate.connection.url", "jdbc:h2:mem:some_test_db;DB_CLOSE_DELAY=-1;MVCC=TRUE;DATABASE_TO_UPPER=false");
pros.setProperty("hibernate.hbm2ddl.auto", "create");
entityManagerFactory = Persistence.createEntityManagerFactory("your_unit", pros);
}
@Before
public void mainTestORMSetUp() throws Exception {
this.entityManager = entityManagerFactory.createEntityManager();
}
现在您有一个可用于每个测试的实体管理器。使用 mockito 在需要的地方注入它。
解决方案 4:使用 Spring Data+Spring Boot 设置 JPA,因此您不再需要实体工厂,您只需使用两个不同的 application.properties(一个用于 main,一个用于测试),然后使用您定义的 Spring实体存储库。或者,您可以使用不同的弹簧轮廓(一个用于测试,另一个用于生产),最终允许您执行相同的操作。这个解决方案是我使用的。检查上面的 URL 以获取更多详细信息。