AbstractTransactionalDataSourceSpringContextTests=鸡肋?
我用mysql做数据库,使用AbstractTransactionalDataSourceSpringContextTests测试时,发现根本没有写数据库,连错误都没有发生,直到我提交了事务才写数据库,并发现了错误。
springside的高人也说过:hibernate太奸诈了,如果全部默认回滚,只会在session里干活,一点不写数据库,达不到完全的测试效果。
http://www.springside.org.cn/docs/reference/UnitTest.htm
如果是这样的话,是否可以认为,AbstractTransactionalDataSourceSpringContextTests对hibernate来说,是个完全的鸡肋?因为不提交的话,事务完全回滚,根本不写数据库,连错误都找不出;提交的话,又破坏了数据。
如果不是鸡肋,那该如何改进?public abstract class AbstractDaoTestCase extends AbstractTransactionalDataSourceSpringContextTests {/** * 不同的应用程序必须指定不同的key值,也就是说不同的应用程序必须覆盖此方法 */@Overrideprotected Object contextKey() {return Constants.FAMEWORK_CONTAINER_KEY;}@Overrideprotected ConfigurableApplicationContext loadContext(Object key) throws Exception {setAutowireMode(AUTOWIRE_BY_NAME);setDefaultRollback(false);return (ConfigurableApplicationContext) ContainerFactory.newInstance((String) key, getResources());} /** * get resources * 可以被子类覆盖 * @return String[] */protected String[] getResources() {return new String[] {"classpath:framework/framework-persistence-hibernate.xml","classpath:biz/biz-bookstore.xml" };}}
然后再继承这个抽象类,代码如下:
public class CustomerDAOTest extends AbstractDaoTestCase {private CustomerDAO customerDAO;public void testCRUD() {Customer customer = new Customer();//customer.setId(1);customer.setLoginid("netfly");customer.setName("netfly");customer.setPasswd("1234");customer.setEmail("oo@oo.com");customer.setAddress("shanghai");customer.setStatus("1");//保存对象,这里总会把数据插入数据库customerDAO.save(customer);//// 保证id生成assertNotNull(customer.getId());//////重新获得对象customer = customerDAO.get(customer.getId());//保证能获取刚才保存的对象assertNotNull(customer);// 保证获取对象的属性值与保存时相同assertEquals("oo@oo.com", customer.getEmail());//// 删除对象//customerDAO.remove(customer);//try {//customerDAO.get(customer.getId());//fail("Entity found in database after deleted");//} catch (Exception e) {//assertNotNull(e.getMessage());//} //这里回滚没有任何效果//transactionManager.rollback(transactionStatus);}/** * @param customerDAO the customerDAO to set */public void setCustomerDAO(CustomerDAO customerDAO) {this.customerDAO = customerDAO;}}13 楼 Godlikeme 2006-12-26 protected ConfigurableApplicationContext loadContext(Object key) throws Exception {