|
锁定老贴子 主题:怎么测试内部类-mock其交互者.
该帖已经被评为新手帖
|
|
|---|---|
| 作者 | 正文 |
|
时间:2006-11-16 关键字: TDD
如题!
这种情况很常见,比如Callback一般就是这种,像用于HibernateTemplate的HibernateCallback。我怎么mock doInHibernate方法的Session? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2006-11-20
怎么没人告诉我啊?既然移到新手讨论区,那应该说明这个问题对你们很简单,可是我就是想了很久很久也不知道怎么mock,谁能指点一下?
|
|
| 返回顶楼 | |
|
时间:2006-11-20
我服了you
看google http://www.hibernate.org/hib_docs/reference/zh-cn/html/quickstart.html#quickstart-intro 这个例子: 用的是内存库.... 就是把库建在内存中的mock |
|
| 返回顶楼 | |
|
时间: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-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测试... 不用内部类 用注入方式把 类从外面作好后注入进代码中.... 写的方式 不好测试... |
|
| 返回顶楼 | |
|
时间:2006-11-30
对,我也考虑过这样写根本就不好测,应该说只要采用内部类,就根本没法单独测试内部类的逻辑。我也考虑过采用外部注入的方式,但是那样就会出现类膨胀,也就失去内部类的意义了,事实上每个内部类的实现方式多数情况下都不一样。我想大家在采用callback的时候,多半也应该都是采用内部类的,是么?
此外如果我采用外部注入的方式的话,比如我采用Hibernate的Template,则如果我的一个类中有10个方法,那我就要注入10个这样的对象,有这个回调接口的10个实现类,那这样太不现实,如果是这样,我宁愿不用callback了。 因此,我每次遇到这样都是只进行集成测试的,但是,当我的callback里有逻辑的时候,我想应该先进行plain类型的测试的,可是我不知道该怎么mock这些协作对象,我想问的就是这个。 |
|
| 返回顶楼 | |
|
时间:2006-11-30
如果对于hibernate这样的持久操作,当然采用内存库是很自然的,没什么问题,这一点我绝对赞成,因为我一直都这么做。
|
|
| 返回顶楼 | |
|
时间:2006-11-30
大家好像都用的是内存库测试DAO的反正我就是
太细化的测试没有意义 你主要目的是写出有意义的测试用例而不是 写出让人头痛的测试用例... |
|
| 返回顶楼 | |
|
时间:2006-11-30
抛出异常的爱 写道 大家好像都用的是内存库测试DAO的反正我就是
太细化的测试没有意义 你主要目的是写出有意义的测试用例而不是 写出让人头痛的测试用例... 对,对于DAO的测试,我也基本上会内存库来测,多数情况下直接进行集成单元测试就行了,但我说的不局限于DAO,而说内部类,想callback这一系列的。如果我现在的模块和数据库没有关系的话,那当然也不存在内存库了。 对于测试用例的目的,我想我们应该是一致的,我遵循,只要对某一个功能,某一实现不放心,就写测试。 此前,对于测试的粒度,我想我还是把握不了,因此我们制定的策略是:对于方法,接口,如果有有逻辑就进行plain的单元测试,否则,就组合各个模块进行模块间的集成单元测试。不知道这样做合不合理? |
|
| 返回顶楼 | |
|
时间:2006-12-01
内部类的测试:?
http://blog.csdn.net/bailang71/archive/2005/01/17/256773.aspx |
|
| 返回顶楼 | |





