我想测试一些方法来检查它们是否真的在数据库中插入数据。
我正在使用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.
}
}
我错过了什么? 测试数据库中数据插入的最佳方法是什么?
答案 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();
}
}