djunit

今天分享了djunit工具的用法。
以后在开发中需要推进。
为什么要用djunit?
1.每次跑junit都需要连接数据库,而我们不关心实际数据,只要模拟就够了。
2.每次都要启动server,慢,我们也不关心server。
3.其他相关的系统(软件和硬件)
怎么办?
1.拷贝一份测试代码,去掉关联的代码,用模拟数据代替。
2.弄一个模拟的外部环境:比如不用orcale,用hsql内存数据库。
3.用流行的jmock。
上面的三个办法都有问题:
1.改动代码需要修改测试代码,对于一些要调用框架代码的业务,要拷贝出来的东西太多。
2.模拟的环境有差异,例子中提到的用hsql,如果我们用oracle相关的函数、语法、存储过程,可能导致测试失败(而实际上代码是对的)。
3.jmock只能替换注入的类(比如spring、CDI等),而实际开发中很多都是new出来的。
可能有人说注入好,替换方便,所有的都注入吧

但是:
1.历史代码需要测试,全部改不现实
2.有些对象简单到不需要注入,或者说在可预见的未来我们不打算换,如果为了jmock来非要求开发人员必须使用注入的话,就本末倒置了---不能由测试来决定我们的设计。注入不是任何情况下都好的。


那我们要测试该怎么办呢????
顺着jmock的思路想下去:
如果new 出来的对象也能mock不就可以了么

于是找到了djunit
使用前准备:
1.有djunit的jar包—不用解释了
2.最好安装djunit的eclipse插件。
3.在testcase的setup调用MockObjectManager.initialize();方法(继承DJUnitTestCase就不用了)
4.通过djunit启动--run as djunit


public class TestService extends TestCase {


@Override
public void setUp() throws Exception {
super.setUp();
MockObjectManager.initialize();
}

public void test1() throws BusinessException {
List<Bean> lst = new ArrayList<Bean>();
lst.add(new Bean());
lst.add(new Bean());
MockObjectManager.addReturnValue(CmnDAO.class, "executeQuery", lst);
// service:return new CmnDAO().executeQuery(sql);
XXXXService service= new XXXXService();

assertEquals(2, i.geItemVOs("001").length);
}
}

例子比较简单,实际上过程可能如下:
queryData = DAO.query("select * from xxx");
......//各种复杂的业务处理
//返回业务处理结果 可能是一个状态

这时候我想mock DAO的query方法,使之直接返回我的模拟数据,然后进行业务处理、返回

最后断言,看下我的业务处理是否正确。
-------------------------------------------------------------------------

关于
MockObjectManager.addReturnValue
djunit里是用一个Map<String,List>来存储你要mock的方法和对应的值。
每次方法被执行的时候去Map中找对应的key,如果没有就交给jvm,
如果有,就取得list.get(0),直接返回给jvm的方法调用。
[b]然后list.remove(0)。[/b]
也就是同一个方法被调多次,你需要MockObjectManager.addReturnValue多次,且顺序需要相同。

如果不想add多次,每次调用mock的方法都返回同一个值该怎么办?
MockObjectManager.setXXXAllTimes(Class,String method,Object returnvalue);

具体用法看文档或者源代码。


不能让测试工具影响开发,该注入的时候就注入,不需要就自己new,不要有后顾之忧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值