您好我已经使用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
?
谢谢!
答案 0 :(得分:1)
此测试中使用的会话是与命令获得的db会话不同的会话。在transaction.commit()之前,您的测试不会看到任何数据更改。
您的测试有效!您不应该使用transaction.commit()而不是session.flush(),因为它会保留您的测试数据并使您的下一次运行更加困难。
如果要调试测试并手动验证测试数据/
,则只执行transaction.commit()而不是session.flush()答案 1 :(得分:1)
session.flush()
并不意味着持久对象将被写入数据库。 flush
仅负责将底层持久存储与内存中持有的持久状态同步。简单地说,它将在正在运行的事务中更新或插入到表中,但它可能不会提交这些更改,这取决于FlushMode
设置。
由于您提供的代码不完整,因此很难说明其是否正确。因为你在userDao.create()
写的是hiiden?你开始Transaction
的地方也不清楚。