单元测试DB中的JPA插入

时间:2014-02-27 14:59:06

标签: hibernate unit-testing jpa junit playframework-2.0

我想测试一些方法来检查它们是否真的在数据库中插入数据。 我正在使用play framework 2.2.1,带有H2内存数据库。 我还引导一个应用程序数据库加载SQL脚本,其中包含一些用于测试加载查询的初始数据。

我写了一篇AbstractTest,我正在考试JPA EntityManager

public abstract class AbstractTest {
    protected EntityManager em;

    @Before
    public void setUp() {
        FakeApplication app = Helpers.fakeApplication();
        Helpers.start(app);
        Option<JPAPlugin> jpaPlugin = app.getWrappedApplication().plugin(JPAPlugin.class);
        em = jpaPlugin.get().em("default");
        JPA.bindForCurrentThread(em);
    }

    @After
    public void tearDown() {
        JPA.bindForCurrentThread(null);
        em.close();
    }
}

通过这个课程,我可以轻松测试加载查询。

但我无法测试方法是否在DB中保存,这是因为JPA Transaction在测试结束时关闭,所以如果我尝试加载对象我只是保存在数据库中我得到null

例如:

public class MessageServiceTest extends AbstractTest {

    public void saveTest(){
        User user = User.findById(2L, User.class);
        Interlocutor interlocutor = Interlocutor.findById(1L, Interlocutor.class);
        Conversation conversation = new Conversation();
        conversation.user = user;
        conversation.interlocutor = interlocutor;
        conversation.save();

        //I know the id of the saved object is 2
        Conversation conversantionFromDb = Conversation.findById(2L, Conversation.class);
        assertThat(conversantionFromDb.id).isEqualTo(2);
       //Null pointer the conversation object is not saved to the DB.
    }
}

我错过了什么? 测试数据库中数据插入的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

找到解决方案,我需要打开并关闭Transaction。所以修改后的AbstractTest类:

public abstract class AbstractTest {
    protected EntityManager em;

    @Before
    public void setUp() {
        FakeApplication app = Helpers.fakeApplication();
        Helpers.start(app);
        Option<JPAPlugin> jpaPlugin = app.getWrappedApplication().plugin(JPAPlugin.class);
        em = jpaPlugin.get().em("default");
        JPA.bindForCurrentThread(em);
        em.getTransaction().begin();
    }

    @After
    public void tearDown() {
        em.getTransaction().commit();
        JPA.bindForCurrentThread(null);
        em.close();
    }
}