2006-11-16

怎么测试内部类-mock其交互者.

关键字: TDD
如题!
这种情况很常见,比如Callback一般就是这种,像用于HibernateTemplate的HibernateCallback。我怎么mock doInHibernate方法的Session?
评论
hyysguyang 2006-12-08
呵呵,看来这么帖子基本结贴了,如果谁有更好的方法,请多多指教,谢谢
抛出异常的爱 2006-12-06
hyysguyang 写道
抛出异常的爱 写道
内部类的测试:?
http://blog.csdn.net/bailang71/archive/2005/01/17/256773.aspx


我知道怎么测了,可以考虑采用ClassLoader来加载匿名内部类,然后就可以采用类似其他类的方式进行测试了,如:
 public void testAddRule() throws Exception
    {
       ClassLoader cl = Thread.currentThread().getContextClassLoader();
       Class clazz=cl.loadClass("InterObj$1");
       Rule rule=(Rule)clazz.newInstance();
       rule.onSchedule(mockTask);
       //...........省略..............
        assertTrue(rule.isScheduled());
}

谢谢啊!

很好的方法
下回我看看会不会用到(我不太用到内部类也是由于不会测试)
hyysguyang 2006-12-06
抛出异常的爱 写道
内部类的测试:?
http://blog.csdn.net/bailang71/archive/2005/01/17/256773.aspx


我知道怎么测了,可以考虑采用ClassLoader来加载匿名内部类,然后就可以采用类似其他类的方式进行测试了,如:
 public void testAddRule() throws Exception
    {
       ClassLoader cl = Thread.currentThread().getContextClassLoader();
       Class clazz=cl.loadClass("InterObj$1");
       Rule rule=(Rule)clazz.newInstance();
       rule.onSchedule(mockTask);
       //...........省略..............
        assertTrue(rule.isScheduled());
}

谢谢啊!
hyysguyang 2006-12-01
抛出异常的爱 写道
内部类的测试:?
http://blog.csdn.net/bailang71/archive/2005/01/17/256773.aspx


呵呵,我说的是内部类的方法的测试用例的编写,不是内部类的知识点.这个连接内部类的知识总结,不过还是谢谢你,
抛出异常的爱 2006-12-01
内部类的测试:?
http://blog.csdn.net/bailang71/archive/2005/01/17/256773.aspx
hyysguyang 2006-11-30
抛出异常的爱 写道
大家好像都用的是内存库测试DAO的反正我就是
太细化的测试没有意义
你主要目的是写出有意义的测试用例而不是
写出让人头痛的测试用例...


对,对于DAO的测试,我也基本上会内存库来测,多数情况下直接进行集成单元测试就行了,但我说的不局限于DAO,而说内部类,想callback这一系列的。如果我现在的模块和数据库没有关系的话,那当然也不存在内存库了。
对于测试用例的目的,我想我们应该是一致的,我遵循,只要对某一个功能,某一实现不放心,就写测试。
此前,对于测试的粒度,我想我还是把握不了,因此我们制定的策略是:对于方法,接口,如果有有逻辑就进行plain的单元测试,否则,就组合各个模块进行模块间的集成单元测试。不知道这样做合不合理?
抛出异常的爱 2006-11-30
大家好像都用的是内存库测试DAO的反正我就是
太细化的测试没有意义
你主要目的是写出有意义的测试用例而不是
写出让人头痛的测试用例...
hyysguyang 2006-11-30
如果对于hibernate这样的持久操作,当然采用内存库是很自然的,没什么问题,这一点我绝对赞成,因为我一直都这么做。
hyysguyang 2006-11-30
对,我也考虑过这样写根本就不好测,应该说只要采用内部类,就根本没法单独测试内部类的逻辑。我也考虑过采用外部注入的方式,但是那样就会出现类膨胀,也就失去内部类的意义了,事实上每个内部类的实现方式多数情况下都不一样。我想大家在采用callback的时候,多半也应该都是采用内部类的,是么?

此外如果我采用外部注入的方式的话,比如我采用Hibernate的Template,则如果我的一个类中有10个方法,那我就要注入10个这样的对象,有这个回调接口的10个实现类,那这样太不现实,如果是这样,我宁愿不用callback了。

因此,我每次遇到这样都是只进行集成测试的,但是,当我的callback里有逻辑的时候,我想应该先进行plain类型的测试的,可是我不知道该怎么mock这些协作对象,我想问的就是这个。
抛出异常的爱 2006-11-30
hyysguyang 写道
不对,这不是我想要的,我说的是测试那个内部类,spring的hibernate的callback只是其中之一,我是要进行plain的test,不是集成test,比如:
/**
     * 根据一个forumId删除属于这个forum的所有板块
     *
     * @param forumId 论坛的id
	 * @throws ForumException 论坛异常
     */
    public void removeBoardsByForumId(final int forumId) throws ForumException
    {
    	HibernateCallback callback=new HibernateCallback(){
			public Object doDataAccess(Session session) throws ForumException
			{
				 Query query = session.createQuery("delete from ForumBoardPO where forumId = :forumId");
		         query.setInteger("forumId", forumId);
		         return query.executeUpdate();
			}
    	};
    	hbmExecutor.execute(callback);
    }

我这个方法里的callback就是一个内部类,我想mock方法doDataAccess(Session session)的session而不是创建真正的session,当然如果是hibernate我也许更应该直接连接数据库来创建真正的session来测试,但是,如果不是hibernate而是其他的callback呢?我们公司现在的很多都用到了callback,什么task,event等都用到了,每次测这些我都没法测内部类,我都不得不进行集成测试,但是这样单元测试这部分就漏了。
望赐教,谢谢。

好像只能去内存库中作了吧

如果说是plain测试...

不用内部类
用注入方式把
类从外面作好后注入进代码中....

写的方式 不好测试...
hyysguyang 2006-11-30
不对,这不是我想要的,我说的是测试那个内部类,spring的hibernate的callback只是其中之一,我是要进行plain的test,不是集成test,比如:
   /**
     * 根据一个forumId删除属于这个forum的所有板块
     *
     * @param forumId 论坛的id
     * @throws ForumException 论坛异常
     */
    public void removeBoardsByForumId(final int forumId) throws ForumException
    {
    	HibernateCallback callback=new HibernateCallback(){
			public Object doDataAccess(Session session) throws ForumException
			{
				 Query query = session.createQuery("delete from ForumBoardPO where forumId = :forumId");
		         query.setInteger("forumId", forumId);
		         return query.executeUpdate();
			}
    	};
    	hbmExecutor.execute(callback);
    }


我这个方法里的callback就是一个内部类,我想mock方法doDataAccess(Session session)的session而不是创建真正的session,当然如果是hibernate我也许更应该直接连接数据库来创建真正的session来测试,但是,如果不是hibernate而是其他的callback呢?我们公司现在的很多都用到了callback,什么task,event等都用到了,每次测这些我都没法测内部类,我都不得不进行集成测试,但是这样单元测试这部分就漏了。
望赐教,谢谢。
抛出异常的爱 2006-11-20
我服了you
看google

http://www.hibernate.org/hib_docs/reference/zh-cn/html/quickstart.html#quickstart-intro

这个例子:
用的是内存库....
就是把库建在内存中的mock
hyysguyang 2006-11-20
怎么没人告诉我啊?既然移到新手讨论区,那应该说明这个问题对你们很简单,可是我就是想了很久很久也不知道怎么mock,谁能指点一下?
hyysguyang
搜索本博客
最近加入圈子
存档
最新评论