如何在单元测试中注入持久性上下文?

2022-09-02 21:52:59

这是我的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);
  }
}

测试失败,因为没有人注入。我应该如何正确处理这种情况?是否存在任何最佳实践?NullPointerExceptionFinder.em


答案 1

如果没有像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();
        }
    }
}

答案 2

这取决于您要测试的内容。当你的类中有复杂的业务逻辑时,你可能想要模拟 - 使用像EasyMockMockito这样的模拟框架 - 以便对该逻辑进行单元测试。FinderEntityManager

现在,由于情况并非如此,我怀疑您要测试实体的持久性(这通常称为集成测试)。这需要使用数据库。为了使测试变得容易并保持测试的可移植性,您可以使用内存中数据库(如HSQLDB)来实现此目的。为了启动HSQLDB,创建一个持久性上下文并将此上下文注入到Finder类中,建议使用像Spring这样的IoC框架。Employee

互联网上有大量的教程解释了如何使用JPA / Spring / HSQLDB。看看这个示例项目:与 Maven 2、Spring 2.5、JPA、Hibernate 和 HSQLDB 的集成测试


推荐