论坛首页 入门技术论坛

使用spring-mock进行dao集成测试

浏览 32869 次
该帖已经被评为新手帖
作者 正文
   发表时间:2005-03-30  
梅 写道
zzeric 写道
dbunit可以避免测试对数据造成污染,利用回滚事务可以实现相同目的。


那请问一下。我测试 Service 的时候, 添加回复的时候,需要的 栏目,分论坛,主题等PO 。是不是需要 手工构造出来。就像我写的那样 ? 如果这样,好像比较麻烦阿?

构造一些mock object有什么麻烦的,不就是set一些属性么。

blueyong 写道
我有个问题:模仿上面的例子,我做了个测试类,里面使用了getUsers()方法不能回滚.
我的测试方法:


贴出你的配置文件。
0 请登录后投票
   发表时间: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 又要再来一遍。  

有没有更好的 解决方案。
0 请登录后投票
   发表时间:2005-04-01  
rongsantang 你好,我的事务配置如下:请指点?
<bean id="txProxyTemplate" abstract="true"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        &lt;property name="transactionManager"&gt;&lt;ref bean="transactionManager"/&gt;&lt;/property&gt;
        &lt;property name="transactionAttributes"&gt;
            &lt;props&gt;
                &lt;prop key="save*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
                &lt;prop key="remove*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
                &lt;prop key="*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;
            &lt;/props&gt;
        &lt;/property&gt;
    </bean>

    <bean id="userManager" parent="txProxyTemplate">
        &lt;property name="target"&gt;
            <bean class="org.appfuse.service.impl.UserManagerImpl">
                &lt;property name="userDAO"&gt;&lt;ref bean="userDAO"/&gt;&lt;/property&gt;
            </bean>
        &lt;/property&gt;
    </bean>
0 请登录后投票
   发表时间:2005-04-01  
仔细看一下我的配置文件和你的区别,这里是测试dao,dao本身不需要事务属性,也就不要用TransactionProxyFactoryBean对它进行proxy了。

另外你的配置文件贴得不全,有点问题。
0 请登录后投票
   发表时间: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 又要再来一遍。  

有没有更好的 解决方案。
0 请登录后投票
   发表时间: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 的方法。我 在 实际环境下测试 是 可以正常工作的 。
0 请登录后投票
   发表时间: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);
    }


[/i]
0 请登录后投票
   发表时间:2005-04-01  
rongsantang to blueyong:另外你的配置文件贴得不全,有点问题。
你能贴出你的事务相关的配置文件吗?
0 请登录后投票
   发表时间:2006-05-07  
我的事务也是这样配置的,但是用AbstractTransactionalDataSourceSpringContextTests的时候就出现问题:
。。。。。
[INFO:main] {org.springframework.beans.factory.support.DefaultListableBeanFactory} - &lt;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]&gt;
[INFO:main] {org.springframework.aop.framework.DefaultAopProxyFactory} - &lt;CGLIB2 available: proxyTargetClass feature enabled&gt;

当执行到这儿时测试程序就死掉了

blueyong 写道
rongsantang 你好,我的事务配置如下:请指点?
&lt;bean id="txProxyTemplate" abstract="true"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;
        &lt;property name="transactionManager"&gt;&lt;ref bean="transactionManager"/&gt;&lt;/property&gt;
        &lt;property name="transactionAttributes"&gt;
            &lt;props&gt;
                &lt;prop key="save*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
                &lt;prop key="remove*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;
                &lt;prop key="*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;
            &lt;/props&gt;
        &lt;/property&gt;
    &lt;/bean&gt;

    &lt;bean id="userManager" parent="txProxyTemplate"&gt;
        &lt;property name="target"&gt;
            &lt;bean class="org.appfuse.service.impl.UserManagerImpl"&gt;
                &lt;property name="userDAO"&gt;&lt;ref bean="userDAO"/&gt;&lt;/property&gt;
            &lt;/bean&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
0 请登录后投票
   发表时间: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.&lt;init&gt;(ClassPathXmlApplicationContext.java:81)
at org.springframework.context.support.ClassPathXmlApplicationContext.&lt;init&gt;(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下都可以成功运行,可是却测试不了。
0 请登录后投票
论坛首页 入门技术版

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