论坛首页 Java企业应用论坛

使用Spring AbstractTransactionalDataSourceSpringContextTests测试

浏览 13763 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-11  
一个测试方法一个transaction,assertEquals这里session还没有关闭,所以你测试不会通过。
0 请登录后投票
   发表时间:2007-04-11  
dada 写道
一个测试方法一个transaction,assertEquals这里session还没有关闭,所以你测试不会通过。

这样说就能够解释了,我一直以为session在dao.delete()方法结束后就关闭了。哈哈
0 请登录后投票
   发表时间:2007-04-11  
总结下, 应该commit transaction才会触发session 的flush的吧。

刚才看了下AbstractTransactionalDataSourceSpringContextTests这个类。他是在onSetup的时候开始transaction 然后在onTeardown时commit transaction。 所以如果不显示调用session.flush的话,table里面是不会有变化的。所以我的设想应该是正确的,flushCurrentSession()方法里面拿的是同一个session。


想要看到数据变化的话 在你的测试方法里面调用下flushCurrentSession()方法就行。。

    protected SessionFactory getSessionFactory(){
    	return (SessionFactory) getApplicationContext().getBean("sessionFactory");
    }
    
    protected void flushCurrentSession(){
    	Session session = SessionFactoryUtils.getSession(getSessionFactory(), false);
    	if (session !=null){
    		session.flush();
    	}
    }
0 请登录后投票
   发表时间:2007-04-11  
AbstractTransactionalDataSourceSpringContextTests里面的tearDown有两个方法:onTearDownInTransaction和onTearDownAfterTransaction
所以你可以试着把flush的操作放在onTearDownInTransaction里面看看,这样你不用每次都要在测试方法里面调用了!
完了把测试结果贴一下,呵呵。
0 请登录后投票
   发表时间:2007-04-11  
dengyin2000 写道
总结下, 应该commit transaction才会触发session 的flush的吧。

刚才看了下AbstractTransactionalDataSourceSpringContextTests这个类。他是在onSetup的时候开始transaction 然后在onTeardown时commit transaction。 所以如果不显示调用session.flush的话,table里面是不会有变化的。所以我的设想应该是正确的,flushCurrentSession()方法里面拿的是同一个session。


想要看到数据变化的话 在你的测试方法里面调用下flushCurrentSession()方法就行。。

    protected SessionFactory getSessionFactory(){
    	return (SessionFactory) getApplicationContext().getBean("sessionFactory");
    }
    
    protected void flushCurrentSession(){
    	Session session = SessionFactoryUtils.getSession(getSessionFactory(), false);
    	if (session !=null){
    		session.flush();
    	}
    }


我觉得改变测试方法比较好:
public void testDelete() {
    service.delete(new Long(1));
    Object obj = service.get(new Long(1));
    assertNull(obj);
}
0 请登录后投票
   发表时间:2007-04-11  
dada 写道
dengyin2000 写道
总结下, 应该commit transaction才会触发session 的flush的吧。

刚才看了下AbstractTransactionalDataSourceSpringContextTests这个类。他是在onSetup的时候开始transaction 然后在onTeardown时commit transaction。 所以如果不显示调用session.flush的话,table里面是不会有变化的。所以我的设想应该是正确的,flushCurrentSession()方法里面拿的是同一个session。


想要看到数据变化的话 在你的测试方法里面调用下flushCurrentSession()方法就行。。

    protected SessionFactory getSessionFactory(){
    	return (SessionFactory) getApplicationContext().getBean("sessionFactory");
    }
    
    protected void flushCurrentSession(){
    	Session session = SessionFactoryUtils.getSession(getSessionFactory(), false);
    	if (session !=null){
    		session.flush();
    	}
    }


我觉得改变测试方法比较好:
public void testDelete() {
    service.delete(new Long(1));
    Object obj = service.get(new Long(1));
    assertNull(obj);
}


我有遇到你这种情况, 一个同事使用jdbc去验证的时候 会有问题, 但是我用service去拿的话 就能通过。 最后发现我这里发送了update语句,而用jdbc去验证的话并没有flush。 我不觉得你上面的方式好。 因为我这种方式对于使用jdbc或者其他方式去验证都是有效的, 而且如果我没有get find方法呢? 我还要为测试去加多这样的方法?
0 请登录后投票
   发表时间:2007-04-11  
tsingn 写道
Godlikeme 写道
每次调用,应该是取的不同的session,这样是不对的,参见HibernateTemaplate.executeWithSession
同意!
但是不知道为什么用不同的session flush一下也会起作用?

flush后session是与数据库同步的,因为测试不是多线程,session之间就不会出现不一致的情况。
0 请登录后投票
   发表时间:2007-04-11  
Godlikeme 写道
每次调用,应该是取的不同的session,这样是不对的,参见HibernateTemaplate.executeWithSession

这个问题我看错了,原来问题是jdbctemplate.execute(),不是不同session的问题。
只能显示调用sessionFlush了,hibernateTemplate和jdbcTemplate一块用,这样不一致性的问题就会一直存在。
0 请登录后投票
   发表时间:2007-04-11  
Godlikeme 写道
Godlikeme 写道
每次调用,应该是取的不同的session,这样是不对的,参见HibernateTemaplate.executeWithSession

这个问题我看错了,原来问题是jdbctemplate.execute(),不是不同session的问题。
只能显示调用sessionFlush了,hibernateTemplate和jdbcTemplate一块用,这样不一致性的问题就会一直存在。


是的  我没有发现,hibernateTemplate有executeWithSession这个方法。
正规的话 当然是应该用jdbc来测试的。 
0 请登录后投票
   发表时间:2007-04-11  
dada 写道
dengyin2000 写道
总结下, 应该commit transaction才会触发session 的flush的吧。

刚才看了下AbstractTransactionalDataSourceSpringContextTests这个类。他是在onSetup的时候开始transaction 然后在onTeardown时commit transaction。 所以如果不显示调用session.flush的话,table里面是不会有变化的。所以我的设想应该是正确的,flushCurrentSession()方法里面拿的是同一个session。


想要看到数据变化的话 在你的测试方法里面调用下flushCurrentSession()方法就行。。

    protected SessionFactory getSessionFactory(){
    	return (SessionFactory) getApplicationContext().getBean("sessionFactory");
    }
    
    protected void flushCurrentSession(){
    	Session session = SessionFactoryUtils.getSession(getSessionFactory(), false);
    	if (session !=null){
    		session.flush();
    	}
    }


我觉得改变测试方法比较好:
public void testDelete() {
    service.delete(new Long(1));
    Object obj = service.get(new Long(1));
    assertNull(obj);
}


刚刚又想到了你这样会不会有问题。看下面的代码,我把delete变成了save

public void testSave() {
    service.save(new Long(1));
    Object obj = service.get(new Long(1));
    assertNull(obj);
}


因为在testSave中是在一个session中, 所以service.get的话可能根本不会读数据库里面的值, 而是拿的session cache中的?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics