该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2005-03-30
梅 写道 zzeric 写道 dbunit可以避免测试对数据造成污染,利用回滚事务可以实现相同目的。
那请问一下。我测试 Service 的时候, 添加回复的时候,需要的 栏目,分论坛,主题等PO 。是不是需要 手工构造出来。就像我写的那样 ? 如果这样,好像比较麻烦阿? 构造一些mock object有什么麻烦的,不就是set一些属性么。 blueyong 写道 我有个问题:模仿上面的例子,我做了个测试类,里面使用了getUsers()方法不能回滚.
我的测试方法: 贴出你的配置文件。 |
|
返回顶楼 | |
发表时间:2005-04-01
rongsantang 写道 梅 写道 zzeric 写道 dbunit可以避免测试对数据造成污染,利用回滚事务可以实现相同目的。
那请问一下。我测试 Service 的时候, 添加回复的时候,需要的 栏目,分论坛,主题等PO 。是不是需要 手工构造出来。就像我写的那样 ? 如果这样,好像比较麻烦阿? 构造一些mock object有什么麻烦的,不就是set一些属性么。 贴出你的配置文件。 问题是 , 测试 孙子 的DAO , 要 把它所有祖先 的PO属性 都 手工 set一遍,在 save一遍。 (虽然 有些 属性 也可以先 不set.但是ID 还是要set的,不set怎么save呢) 就这个例子来说。 回复的父亲 是主题,主题的父亲是 分论坛,分论坛的父亲是 栏目, 另外 ,回复 还有个 父类, 就是发帖人 PO。数了一下。为了测试这一个DAO 。要 构造 5个PO 。而 构造 这5个PO 最少要 set 5个ID 。save 5次PO . 这还只是测试DAO 。如果测试Service 又要再来一遍。 ![]() 有没有更好的 解决方案。 |
|
返回顶楼 | |
发表时间:2005-04-01
rongsantang 你好,我的事务配置如下:请指点?
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref bean="transactionManager"/></property> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="remove*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <bean id="userManager" parent="txProxyTemplate"> <property name="target"> <bean class="org.appfuse.service.impl.UserManagerImpl"> <property name="userDAO"><ref bean="userDAO"/></property> </bean> </property> </bean> |
|
返回顶楼 | |
发表时间:2005-04-01
仔细看一下我的配置文件和你的区别,这里是测试dao,dao本身不需要事务属性,也就不要用TransactionProxyFactoryBean对它进行proxy了。
另外你的配置文件贴得不全,有点问题。 |
|
返回顶楼 | |
发表时间:2005-04-01
要把test当作一件重要的事情来做,虽然构造set是麻烦一些。
嘉嘉 写道 rongsantang 写道 梅 写道 zzeric 写道 dbunit可以避免测试对数据造成污染,利用回滚事务可以实现相同目的。
那请问一下。我测试 Service 的时候, 添加回复的时候,需要的 栏目,分论坛,主题等PO 。是不是需要 手工构造出来。就像我写的那样 ? 如果这样,好像比较麻烦阿? 构造一些mock object有什么麻烦的,不就是set一些属性么。 贴出你的配置文件。 问题是 , 测试 孙子 的DAO , 要 把它所有祖先 的PO属性 都 手工 set一遍,在 save一遍。 (虽然 有些 属性 也可以先 不set.但是ID 还是要set的,不set怎么save呢) 就这个例子来说。 回复的父亲 是主题,主题的父亲是 分论坛,分论坛的父亲是 栏目, 另外 ,回复 还有个 父类, 就是发帖人 PO。数了一下。为了测试这一个DAO 。要 构造 5个PO 。而 构造 这5个PO 最少要 set 5个ID 。save 5次PO . 这还只是测试DAO 。如果测试Service 又要再来一遍。 ![]() 有没有更好的 解决方案。 |
|
返回顶楼 | |
发表时间:2005-04-01
谢谢你的回复。 我现在在用你这个方法测试DAO的时候,遇到一个奇怪的问题。
我BaseDAOHibernate.java中有2个方法: //根据id得到一个PO public Object getObject(Class clazz, Serializable id); { Object o = getHibernateTemplate();.get(clazz, id);; if (o == null); { throw new ObjectRetrievalFailureException(clazz, id);; } return o; } //根据一个VO得到一个PO public void getObject(Object obj); { getHibernateTemplate();.refresh(obj);; } 分别是根据id和vo得到 一个PO。 现在在测试的时候, 根据Id 没有问题。 但是 调用 getObject(Object obj)方法就出错了。 //测试根据一个VO得到一个PO public void testGetPO();{ //新增一个PO,为测试做准备 CompanyInf companyInf = GetPoUsed.getCompanyInf();; dao.saveObject(companyInf);; EmployeeInf employeeInf = GetPoUsed.getEmployeeInf(companyInf,true);; dao.saveObject(employeeInf);; assertNotNull(employeeInf.getEmployeeId(););; EmployeeInf employeeInfPO =(EmployeeInf);dao.getObject(EmployeeInf.class,employeeInf.getEmployeeId(););; assertEquals(employeeInfPO.getEmployeeName();,employeeInf.getEmployeeName(););; //根据VO得到一个PO EmployeeInf employeeInfVO = GetPoUsed.getEmployeeInf(companyInf,false);; employeeInfVO.setEmployeeId(employeeInf.getEmployeeId(););; logger.info("employeeInf.getEmployeeId(); : " + employeeInf.getEmployeeId(););; dao.getObject(employeeInfVO);; //测试得到的PO是否正确 // assertNotNull(employeeInfVO);; // assertEquals(employeeInfVO.getCompanyInf();.getCompanyName();,employeeInf.getCompanyInf();.getCompanyName(););; } 就是 dao.getObject(employeeInfVO); 这句出错。信息如下: 引用 org.springframework.orm.hibernate.HibernateObjectRetrievalFailureException: No row with the given identifier exists: 402881b202fce5930102fce5a3180006, of class: org.erp.po.EmployeeInf; nested exception is net.sf.hibernate.UnresolvableObjectException: No row with the given identifier exists: 402881b202fce5930102fce5a3180006, of class: org.erp.po.EmployeeInf
net.sf.hibernate.UnresolvableObjectException: No row with the given identifier exists: 402881b202fce5930102fce5a3180006, of class: org.erp.po.EmployeeInf at net.sf.hibernate.UnresolvableObjectException.throwIfNull(UnresolvableObjectException.java:38) at net.sf.hibernate.impl.SessionImpl.refresh(SessionImpl.java:2184) at net.sf.hibernate.impl.SessionImpl.refresh(SessionImpl.java:2146) at org.springframework.orm.hibernate.HibernateTemplate$7.doInHibernate(HibernateTemplate.java:311) at org.springframework.orm.hibernate.HibernateTemplate.execute(HibernateTemplate.java:228) at org.springframework.orm.hibernate.HibernateTemplate.refresh(HibernateTemplate.java:309) at com.erp.dao.hibernate.BaseDAOHibernate.getObject(BaseDAOHibernate.java:33) at tdd.test.dao.TestEmployeeDAO.testGetPO(TestEmployeeDAO.java:92) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at junit.framework.TestCase.runTest(TestCase.java:154) at junit.framework.TestCase.runBare(TestCase.java:127) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:421) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:305) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:186) 他好像是说数据库中 没有 这个id是 ***的 记录 。测试之前 数据库是没有,之后 也 被事务回滚 没了。中间 的时候 有没有 ? 应该是有的阿。 根据id那个方法 都能通过。为什么 根据vo的方法 通不过呢? 我查了 HibernateTemplate的源代码,他们2个分别是: public Object get(final Class entityClass, final Serializable id); throws DataAccessException { return execute(new HibernateCallback(); { public Object doInHibernate(Session session); throws HibernateException { return session.get(entityClass, id);; } });; } public void refresh(final Object entity); throws DataAccessException { execute(new HibernateCallback(); { public Object doInHibernate(Session session); throws HibernateException { session.refresh(entity);; return null; } });; } 不明白 这2个不同的方法 和 那个事务回滚 是不是有什么 说法。导致我测试不能成功。/?? 补充一句, 这个通过VO得到PO 的方法。我 在 实际环境下测试 是 可以正常工作的 。 |
|
返回顶楼 | |
发表时间:2005-04-01
我现在发现当我测试 插入操作时候 ,这种方式
引用 assertNotNull(employeeInf.getEmployeeId());
EmployeeInf employeeInfPO =(EmployeeInf)dao.getObject(EmployeeInf.class,employeeInf.getEmployeeId()); assertEquals(employeeInfPO.getEmployeeName(),employeeInf.getEmployeeName()); 可以通过,就是 没有报告错误。而 用 楼主题到的那种方式 引用 String employeeName = (String) jdbcTemplate.queryForObject("select EMPLOYEE_NAME from EMPLOYEE_INF where EMPLOYEE_ID=?", new Object[]{employeeInf.getEmployeeId()}, String.class);
assertEquals(employeeInf.getEmployeeName(),employeeName); 就报告说 没有相应记录。我完整代码这样。 引用 //测试增加一个用户
public void testInsert() { CompanyInf companyInf = GetPoUsed.getCompanyInf(); dao.saveObject(companyInf); EmployeeInf employeeInf = GetPoUsed.getEmployeeInf(companyInf,true); dao.saveObject(employeeInf); // assertNotNull(employeeInf.getEmployeeId()); // EmployeeInf employeeInfPO =(EmployeeInf)dao.getObject(EmployeeInf.class,employeeInf.getEmployeeId()); // assertEquals(employeeInfPO.getEmployeeName(),employeeInf.getEmployeeName()); String employeeName = (String) jdbcTemplate.queryForObject("select EMPLOYEE_NAME from EMPLOYEE_INF where EMPLOYEE_ID=?", new Object[]{employeeInf.getEmployeeId()}, String.class); assertEquals(employeeInf.getEmployeeName(),employeeName); } ![]() |
|
返回顶楼 | |
发表时间:2005-04-01
rongsantang to blueyong:另外你的配置文件贴得不全,有点问题。
你能贴出你的事务相关的配置文件吗? |
|
返回顶楼 | |
发表时间:2006-05-07
我的事务也是这样配置的,但是用AbstractTransactionalDataSourceSpringContextTests的时候就出现问题:
。。。。。 [INFO:main] {org.springframework.beans.factory.support.DefaultListableBeanFactory} - <Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [foo,config,remindService,initApplication,applicationService,applicationStateService,staffManageService,superiorExpressReportService,superiorSigninStateService,superiorJournalService,superiorStaffManageService,signinReportService,photoDisplayClz,photoService,loginService,journalService,signinService,expressService,weeklyService,juniorSigninService,modifyUserService,modifyDutyMessageService,userManagerService,sessionFactory,transactionManager,txProxyTemplate,/ExpressReportService,expressReportServiceImpl,/SigninReportService,signinReportServiceImpl,/JournalReportService,juniorJournalReportImpl,/JuniorStaffManageService,juniorStaffManageService]; root of BeanFactory hierarchy]> [INFO:main] {org.springframework.aop.framework.DefaultAopProxyFactory} - <CGLIB2 available: proxyTargetClass feature enabled> 当执行到这儿时测试程序就死掉了 blueyong 写道 rongsantang 你好,我的事务配置如下:请指点?
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref bean="transactionManager"/></property> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="remove*">PROPAGATION_REQUIRED</prop> <prop key="*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean> <bean id="userManager" parent="txProxyTemplate"> <property name="target"> <bean class="org.appfuse.service.impl.UserManagerImpl"> <property name="userDAO"><ref bean="userDAO"/></property> </bean> </property> </bean> |
|
返回顶楼 | |
发表时间:2006-05-21
你好啊~~请问知道这个是什么错误吗?
org.springframework.beans.factory.BeanDefinitionStoreException: Error registering bean with name 'dataSource' defined in class path resource [applicationContext.xml]: Class that bean class [org.apache.commons.dbcp.BasicDataSource] depends on not found; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:219) at org.springframework.util.ClassUtils.forName(ClassUtils.java:88) at org.springframework.beans.factory.support.BeanDefinitionReaderUtils.createBeanDefinition(BeanDefinitionReaderUtils.java:65) at org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser.parseBeanDefinitionElement(DefaultXmlBeanDefinitionParser.java:369) at org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser.parseBeanDefinitionElement(DefaultXmlBeanDefinitionParser.java:335) at org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser.parseBeanDefinitions(DefaultXmlBeanDefinitionParser.java:266) at org.springframework.beans.factory.xml.DefaultXmlBeanDefinitionParser.registerBeanDefinitions(DefaultXmlBeanDefinitionParser.java:186) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:246) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:163) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:125) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:141) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113) at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:81) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:89) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:268) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:81) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:66) at org.springframework.test.AbstractSpringContextTests.loadContextLocations(AbstractSpringContextTests.java:121) at org.springframework.test.AbstractDependencyInjectionSpringContextTests.loadContextLocations(AbstractDependencyInjectionSpringContextTests.java:161) at org.springframework.test.AbstractSpringContextTests.getContext(AbstractSpringContextTests.java:101) at org.springframework.test.AbstractDependencyInjectionSpringContextTests.setUp(AbstractDependencyInjectionSpringContextTests.java:129) at junit.framework.TestCase.runBare(TestCase.java:125) at junit.framework.TestResult$1.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:118) at junit.framework.TestSuite.runTest(TestSuite.java:208) at junit.framework.TestSuite.run(TestSuite.java:203) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 我在tomcat下都可以成功运行,可是却测试不了。 |
|
返回顶楼 | |