【发布时间】:2014-05-10 17:04:13
【问题描述】:
我正在尝试为 JPA DAO 类编写 JUnit 测试。
类的构造器需要一个 EntityManager 所以我正在尝试使用 LocalContainerEntityManagerFactoryBean 创建一个。
一旦我创建了 LocalContainerEntityManagerFactoryBean,我将在其上调用 getObject(),希望检索 EntityManagerFactory 以允许我创建 EntityManager,但 getObject() 返回 Null。
我也尝试过 getNativeEntityManagerFactory(),但它也返回 Null。
我做错了什么?
(我使用 H2 作为数据库,但这应该没什么区别)
代码如下:
Map<String, String> properties = new HashMap<>();
properties.put("javax.persistence.jdbc.driver", "org.h2.Driver");
properties.put("javax.persistence.jdbc.url", "jdbc:h2:mem:MyUnitTest");
Properties addProperties = new Properties();
addProperties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
addProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
LocalContainerEntityManagerFactoryBean emfCB = new LocalContainerEntityManagerFactoryBean();
emfCB.setPersistenceProviderClass(org.eclipse.persistence.jpa.PersistenceProvider.class);
emfCB.setPackagesToScan("com.something.mymodel");
emfCB.setPersistenceUnitName("myUnit");
emfCB.setJpaPropertyMap(properties);
//emf.setLoadTimeWeaver(new ReflectiveLoadTimeWeaver()); -> This doesn't work
emfCB.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
emfCB.setJpaVendorAdapter(vendorAdapter);
emfCB.setJpaProperties(addProperties);
EntityManagerFactory emf = emfCB.getObject(); // -> This is Null !
MyDao dao = new MyDao(emf);
【问题讨论】:
-
你应该使用spring Junit runner 进行那种测试(或一些模拟)
-
从以下链接查看 Spring Integration Testing 的文档:docs.spring.io/spring/docs/4.0.3.RELEASE/…
-
谢谢大家,虽然我不想使用模拟(通过使用 H2 我正在模拟数据库,但我希望代码与它进行交互,就好像它是真正的数据库一样,而不是通过模仿等)。 @geoand 我阅读了与 LocalContainerEntityManagerFactoryBean 相关的部分,但那里没有什么非常有用的内容,也没有关于如何创建 EntityManager 的完整示例。
-
如果您使用集成测试策略(并且已经正确配置了LocalContainerEntityManagerFactoryBean),您可以轻松地在测试中注入EntityManagerFactory,然后您可以从那里检索EntityManager
标签: java spring jpa h2 entitymanager