本文假设读者已经了解了MockObjects的使用目的和基本方式,不对MockTest之类的技术作过多解释。仅提醒一句:“不要测试你的MockObjects”。
本文作为一个评测结果的同时,也可以作为EasyMock和jMock的简短教程。他们本身都很易用,可惜带的示例过于复杂,都用了过多的模式。看过本文的例子,相信就可以从容的在项目中使用了。
Java中常用的MockObjects有EasyMock和jMock等。其中EasyMock开发较早,已经出了1.1版本,而jMock前几天才刚推出了1.0 final。作为刚成熟的小弟弟,jMock有什么竞争实力呢?
本比较针对于以下几个方面,代码请见附件。
1是否能够对具体类进行模拟(当然,对接口模拟是基本功能)
2是否能够对方法名,参数,返回值进行动态控制
3基本代码行数
4是否能够对具有构造参数的具体类模拟
现在比较开始了。首先制作若干测试文件,很简单。要模拟的有一个接口和一个具体类,叫做TheInterfaceToMock和TheClassToMock,另外,提供方法SampleReturn sampleMethod(Parameter p);以及同名无参数方法。
第一个测试是针对TheInterfaceToMock,提供ParameterImpl和SampleReturnImpl作为期待的参数和返回值。jMock代码如下:
publiclearcase/" target="_blank" >cclassJMockUsageextendsMockObjectTestCase{ publicvoidtestReturnValueWithParemeter(){ //构造Mock控制器 Mockm=newMock(TheInterfaceToMock.class); //这是要测试MockObject TheInterfaceToMockmock=(TheInterfaceToMock)m.proxy(); //期待的返回值 SampleReturnsr=newSampleReturnImpl(); //期待的参数 Parameterp=newParameterImpl(); //控制器,期待一次,方法sampleMethod,参数等于p(equals),将返回sr m.expects(once()).method("sampleMethod") .with(eq(p)).will(returnValue(sr)); //正式执行mockobject SampleReturnret=mock.sampleMethod(newParameterImpl()); //确定返回值是相同的 assertSame(sr,ret); }}