这是我的java类:
public class Finder {
@PersistenceContext(unitName = "abc")
EntityManager em;
public boolean exists(int i) {
return (this.em.find(Employee.class, i) != null);
}
}
这是单元测试:
public class FinderTest {
@Test public void testSimple() {
Finder f = new Finder();
assert(f.exists(1) == true);
}
}
由于NullPointerException
未被任何人注入,因此Finder.em
测试失败。我该如何妥善处理这种情况?有没有最佳实践?
答案 0 :(得分:13)
如果没有像Spring这样的容器(或类似Unitils的容器 - 基于Spring),则必须手动注入实体管理器。在这种情况下,可以使用类似这样的基类:
public abstract class JpaBaseRolledBackTestCase {
protected static EntityManagerFactory emf;
protected EntityManager em;
@BeforeClass
public static void createEntityManagerFactory() {
emf = Persistence.createEntityManagerFactory("PetstorePu");
}
@AfterClass
public static void closeEntityManagerFactory() {
emf.close();
}
@Before
public void beginTransaction() {
em = emf.createEntityManager();
em.getTransaction().begin();
}
@After
public void rollbackTransaction() {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
if (em.isOpen()) {
em.close();
}
}
}
答案 1 :(得分:4)
这取决于您要测试的 。当您的Finder
类中有复杂的业务逻辑时,您可能想要使用EasyMock或Mockito之类的模拟框架来模拟EntityManager
- 以便对该逻辑进行单元测试。
既然情况并非如此,我怀疑你想要测试Employee
实体的持久性(这通常被称为集成测试)。这需要使用数据库。为了便于测试并保持测试的可移植性,您可以使用内存数据库(如HSQLDB)来实现此目的。为了启动HSQLDB,创建持久化上下文并将此上下文注入Finder类,建议使用像Spring这样的IoC框架。
互联网上有大量的教程解释了如何使用JPA / Spring / HSQLDB。看一下这个示例项目:Integration testing with Maven 2, Spring 2.5, JPA, Hibernate, and HSQLDB
答案 2 :(得分:0)
创建另一个程序包专用的构造函数,并仅添加EntityManager,然后调用另一个构造函数以获取默认行为。
zzz