Java 如何测试org.hibernate.Session?
您好,我已经用junit 4测试了这段代码:Java 如何测试org.hibernate.Session?,java,hibernate,session,junit4,Java,Hibernate,Session,Junit4,您好,我已经用junit 4测试了这段代码: public class UserDaoTest { /** * Runs before all test methods */ @BeforeClass public static void createDB() { sessionFactory = HibernateUtil.getSessionFactory(); userDao = new UserDaoImpl(
public class UserDaoTest {
/**
* Runs before all test methods
*/
@BeforeClass
public static void createDB() {
sessionFactory = HibernateUtil.getSessionFactory();
userDao = new UserDaoImpl();
languageDao = new LanguageDaoImpl();
requestDao = new RequestDaoImpl();
feedbackDao = new FeedbackDaoImpl();
hostelDao = new HostelDaoImpl();
imageDao = new ImageDaoImpl();
}
/**
* Runs after all test methods
*/
@AfterClass
public static void closeSessionFactory() {
HibernateUtil.shutdown();
}
/**
* Runs before each test method
*
* @return
*/
@Before
public void beginTransaction() {
session = sessionFactory.getCurrentSession();
transaction = session.beginTransaction();
}
/**
* Runs after each test method
*/
@After
public void rollbackTransaction() {
if (transaction != null && transaction.isActive()) {
System.out.println("Rolling back trasnaction after @Test method");
// rollback transaction so that tests don't modify database
transaction.rollback();
}
}
@Test
public void testSaveUser() {
User user1 = new User("Ostap", "Stashyshyn", Gender.MALE);
// save user. It delegates to `session.save(user1)` method.
userDao.create(user1);
Integer userId = user1.getUserId();
Assert.assertNotNull(userId);
// causes persistent entities to be saved into persistent context
session.flush();
// read languages from db
List<User> users = userDao.readAll();
Assert.assertThat(users.size(), CoreMatchers.is(1));
// next method annotated with @After is running.
// It rollbacks transaction causing hibernate not to store data into database. Thus database state is the same as when entering this test method
}
它测试成功,但当我在session.flush之后设置断点并从命令行转到db时,我看到用户并没有行
调用userDao.readAll;导致hibernate发出select语句并返回用户
我在控制台上看到insert和select语句,但在db中没有看到。但当我调用transaction.commit而不是session.flush时,相应的数据在db中
以上代码是测试保存用户的正确方法吗?或者我应该调用transaction.commit而不是session.flush
编辑:我将坚持这种测试org.hibernate.Session的方法
谢谢大家! 此测试中使用的会话与从命令获得的db会话不同。在transaction.commit之前,您不会看到测试中的任何数据更改 你的测试是有效的!您不应该使用transaction.commit而不是session.flush,因为它将持久化您的测试数据并使您的下一次运行更加困难 如果要调试测试并手动验证测试数据,只需执行transaction.commit而不是session.flush/session.flush并不意味着持久对象将写入数据库。flush只负责将底层持久存储与内存中的持久状态同步。简单地说,它将在正在运行的事务中更新或插入到您的表中,但它可能不会提交这些更改—这取决于FlushMode设置
由于您给出的代码不完整,因此很难判断其正确与否。因为你在userDao.create中写的是hiiden?您在哪里开始交易也不清楚。谢谢比尔。我将使用session.flush!我认为出于测试目的,数据应该放在数据库中,但您说只要将持久性实体与持久性上下文同步就足够了。这是否正确?测试期间数据以db为单位。但是,通常事务将在测试完成后回滚