本文假設讀者已經了解了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); }}