Junit 单元测试持久层(JPA/EclipseLink)

Junit 单元测试持久层(JPA/EclipseLink),junit,Junit,我不确定在没有准备好的内存数据库的情况下,测试数据库的正确方法是什么。我有以下JUnit4的测试套件 忽略JpaManager,我只需要它,因为应用程序作为EclipseRCP运行,而不是在容器中运行,也没有使用Spring(目前),所以我无法注入EntityManager引用,必须手动处理它 因为我在一个真实的数据库上运行,所以我正在创建我要在setUp方法中测试的对象,并在测试完成后将其删除这正是我的问题:这种设置和拆卸实际上也可能是某种测试(testCustomerSaving、testC

我不确定在没有准备好的内存数据库的情况下,测试数据库的正确方法是什么。我有以下JUnit4的测试套件

忽略JpaManager,我只需要它,因为应用程序作为EclipseRCP运行,而不是在容器中运行,也没有使用Spring(目前),所以我无法注入EntityManager引用,必须手动处理它

因为我在一个真实的数据库上运行,所以我正在创建我要在setUp方法中测试的对象,并在测试完成后将其删除这正是我的问题:这种设置和拆卸实际上也可能是某种测试(testCustomerSaving、testCustomerDelete),但当我以特定顺序运行测试时,它们不会被隔离(保存失败时,加载也会失败,然后删除)


正确的方法是什么?

设置中开始事务
并在
拆卸中回滚事务

这就是“开始和处置”中实际发生的情况。但是,由于我在存储了提交之后才进行提交,以便能够在测试中从db加载它,所以回滚并不是删除对象。也许这是一种错误的方式。如果只从JPA缓存加载项目,假设没有差异,那么测试就足够了吗?那么,您不能走捷径。在测试方法中,按照实际用例/用户故事中调用的顺序进行调用。在同一事务中查看查询中的持久数据不需要提交,只需要使用flush()强制执行插入。然后,后续选择将看到该数据,只要它们使用相同的底层连接。
public class CustomerJpaTest {

    private Customer testCustomer;

    @Before
    public void setUp() throws Exception {
        JpaManager.getInstance().begin();
        // create a new user for testing
        CustomerJpaDao dao = new CustomerJpaDao();
        testCustomer = new Customer();
        testCustomer.setName("Someone");
        dao.persist(testCustomer);
        JpaManager.getInstance().commit();
    }

    @After
    public void tearDown() throws Exception {
        // remove previously created user
        CustomerJpaDao dao = new CustomerJpaDao();
        dao.remove(testCustomer);
        JpaManager.getInstance().commit();
        JpaManager.getInstance().dispose();
    }

    @Test
    public void testCustomerSaving() throws Exception {
        // not sure yet
    }

    @Test
    public void testCustomerLoading() throws Exception {
        ICustomerDao dao = new CustomerJpaDao();
        Customer customer = dao.findByName("Someone");
        assertEquals("Someone", customer.getName());
    }
}