gpt4 book ai didi

java - 如何测试org.hibernate.Session?

转载 作者:行者123 更新时间:2023-12-02 05:40:50 27 4
gpt4 key购买 nike

您好,我已经使用 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() 之后设置断点并从命令行转到数据库时,我发现没有用户的行。

调用userDao.readAll();会导致hibernate发出select语句并返回用户?

我在控制台上看到插入和选择语句,但在数据库中没有看到任何内容。但是,当我调用 transaction.commit() 而不是 session.flush() 时,适当的数据就在数据库中。

上面的代码是测试保存用户的正确方法吗?或者我应该调用 transaction.commit() 而不是 session.flush()

编辑:我应该坚持这种测试org.hibernate.Session的方式?

谢谢!

最佳答案

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

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

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

关于java - 如何测试org.hibernate.Session?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24527534/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com