Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试org.hibernate.Session?_Java_Hibernate_Session_Junit4 - Fatal编程技术网

Java 如何测试org.hibernate.Session?

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(

您好,我已经用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的方法


谢谢大家!

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

你的测试是有效的!您不应该使用transaction.commit而不是session.flush,因为它将持久化您的测试数据并使您的下一次运行更加困难

如果要调试测试并手动验证测试数据,只需执行transaction.commit而不是session.flush/

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


由于您给出的代码不完整,因此很难判断其正确与否。因为你在userDao.create中写的是hiiden?您在哪里开始交易也不清楚。

谢谢比尔。我将使用session.flush!我认为出于测试目的,数据应该放在数据库中,但您说只要将持久性实体与持久性上下文同步就足够了。这是否正确?测试期间数据以db为单位。但是,通常事务将在测试完成后回滚