如何测试org.hibernate.Session?

时间:2014-07-02 09:29:57

标签: 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();
        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

谢谢!

2 个答案:

答案 0 :(得分:1)

此测试中使用的会话是与命令获得的db会话不同的会话。在transaction.commit()之前,您的测试不会看到任何数据更改。

您的测试有效!您不应该使用transaction.commit()而不是session.flush(),因为它会保留您的测试数据并使您的下一次运行更加困难。

如果要调试测试并手动验证测试数据/

,则只执行transaction.commit()而不是session.flush()

答案 1 :(得分:1)

session.flush()并不意味着持久对象将被写入数据库。 flush仅负责将底层持久存储与内存中持有的持久状态同步。简单地说,它将在正在运行的事务中更新或插入到表中,但它可能不会提交这些更改,这取决于FlushMode设置。

由于您提供的代码不完整,因此很难说明其是否正确。因为你在userDao.create()写的是hiiden?你开始Transaction的地方也不清楚。