我进行了一些单元测试,将一些Person
数据存储到数据库中。为此,我使用EntityManagerFactory
。
@Test
public void findPersonById() {
personDao.savePerson(new Person("Hans"));
Person person = new Person("Peter");
personDao.savePerson(person);
Long id = person.getId();
flushAndClear();
person = personDao.findById(id);
assertThat(person.getName(), is("Peter"));
}
其中
private EntityManager entityManager;
public Person savePerson(Person person) {
entityManager.persist(person);
return person;
}
和
public Person findById(Long id) {
Person person = entityManager.find(Person.class, id);
return person;
}
使用此Base-Test-class
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import org.junit.After;
import org.junit.Before;
public class AbstractDaoTest {
protected EntityManager entityManager = Persistence.createEntityManagerFactory("DefaultPersistenceUnit")
.createEntityManager();
protected PersonDao personDao = new PersonDao();
@Before
public void setUp() {
personDao.setEntityManager(entityManager);
entityManager.getTransaction().begin();
}
@After
public void tearDown() {
entityManager.getTransaction().rollback();
}
protected void flushAndClear() {
entityManager.flush();
entityManager.clear();
}
}
我的单元测试运行为绿色,但是当我调试此测试时,我无法在db上看到任何数据(使用squirrel)。调试器当前处于哪个步骤并不重要,表始终为空。我对squirrel使用以下配置:
jdbc:h2:file:~/test;DB_CLOSE_DELAY=-1;LOCK_MODE=0;AUTO_SERVER=TRUE
with Driver: H2
你能帮忙解决这个问题吗?
答案 0 :(得分:0)
这是因为您的测试用例设计不当。
首先,如果您希望将数据添加到数据库,则应在任何更新/插入操作之后提交更改。只有在事务期间有任何异常时,才必须进行回滚。
将测试设计成这样的东西。
@BeforeTest
public void setUp() {
personDao.setEntityManager(entityManager);
entityManager.getTransaction().begin();
}
@AfterTest
public void tearDown() {
// TODO clear all inserted data either using sql statement or JPA
//Rollback only if there is any exception
entityManager.getTransaction().rollback();
}
@Test
public void findPersonById() {
Long id = System.currentTimeMillis();
personDao.savePerson(new Person(id,"Hans"));
entityManager.flush();
// TODO your assert statements go in here
/* Data is visible till here during your debug.
Once AfterTest is executed then the your data would be rolled back
*/
}
我已经使用testNG作为我的单元测试工具,请根据您的要求使用合适的工具。 此外,如果您是enityManager.flush(),则插入/更新语句将被发送到DB,但在由HIbernate将提交指令发送到DB之前不会提交。请参阅this答案了解更多详情