2006-11-16
怎么测试内部类-mock其交互者.
关键字: TDD
如题!
这种情况很常见,比如Callback一般就是这种,像用于HibernateTemplate的HibernateCallback。我怎么mock doInHibernate方法的Session?
这种情况很常见,比如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
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
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
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
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这些协作对象,我想问的就是这个。
此外如果我采用外部注入的方式的话,比如我采用Hibernate的Template,则如果我的一个类中有10个方法,那我就要注入10个这样的对象,有这个回调接口的10个实现类,那这样太不现实,如果是这样,我宁愿不用callback了。
因此,我每次遇到这样都是只进行集成测试的,但是,当我的callback里有逻辑的时候,我想应该先进行plain类型的测试的,可是我不知道该怎么mock这些协作对象,我想问的就是这个。
抛出异常的爱
2006-11-30
hyysguyang 写道
不对,这不是我想要的,我说的是测试那个内部类,spring的hibernate的callback只是其中之一,我是要进行plain的test,不是集成test,比如:
我这个方法里的callback就是一个内部类,我想mock方法doDataAccess(Session session)的session而不是创建真正的session,当然如果是hibernate我也许更应该直接连接数据库来创建真正的session来测试,但是,如果不是hibernate而是其他的callback呢?我们公司现在的很多都用到了callback,什么task,event等都用到了,每次测这些我都没法测内部类,我都不得不进行集成测试,但是这样单元测试这部分就漏了。
望赐教,谢谢。
好像只能去内存库中作了吧
/**
* 根据一个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,比如:
我这个方法里的callback就是一个内部类,我想mock方法doDataAccess(Session session)的session而不是创建真正的session,当然如果是hibernate我也许更应该直接连接数据库来创建真正的session来测试,但是,如果不是hibernate而是其他的callback呢?我们公司现在的很多都用到了callback,什么task,event等都用到了,每次测这些我都没法测内部类,我都不得不进行集成测试,但是这样单元测试这部分就漏了。
望赐教,谢谢。
/**
* 根据一个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
看google
http://www.hibernate.org/hib_docs/reference/zh-cn/html/quickstart.html#quickstart-intro
这个例子:
用的是内存库....
就是把库建在内存中的mock
hyysguyang
2006-11-20
怎么没人告诉我啊?既然移到新手讨论区,那应该说明这个问题对你们很简单,可是我就是想了很久很久也不知道怎么mock,谁能指点一下?
- 浏览: 24596 次
- 性别:


- 详细资料
搜索本博客
最近加入圈子
最新评论
-
这样的TDD实践方式有问题 ...
gigix 写道马伟 写道也不准你递归 , 用递归就是把循环给转移了位置而已 你 ...
-- by 马伟 -
这样的TDD实践方式有问题 ...
马伟 写道也不准你递归 , 用递归就是把循环给转移了位置而已 你这说法就不对了。 ...
-- by gigix -
这样的TDD实践方式有问题 ...
gigix 写道ball_cao 写道这个帖子让我想起以前的一个面试题:给出n要 ...
-- by 马伟 -
这样的TDD实践方式有问题 ...
ball_cao 写道这个帖子让我想起以前的一个面试题:给出n要求计算1到n的和 ...
-- by gigix -
这样的TDD实践方式有问题 ...
强帖虽然我们不用TDD,连单元测试都不用(惭愧~)一定要好好学习之,也体会一下其 ...
-- by 雁行






评论排行榜