一、EasyMock 使用動態代理實現模擬對象創建,一般可以滿足以下測試需求
1、要測試的模塊依賴於其它自己控制不了的模塊,如第三方服務,其它組員在開發的服務等,它們都沒辦法配合你來測試;
2、涉及到數據庫操作,但當時條件連接不了數據庫或你不想將自己的測試結果改動到數據庫;
3、模塊依賴於spring容器注入其它服務實例,但你又不想啟動spring容器。
總之,EasyMock能幫我們模擬出任何我們想要的支持對象,並且我們可以使用這些對象進行邏輯操作
二、具體使用方法
1、模擬成員變量
EasyMock.createMock(要模擬的成員變量類型);
2、設定模擬成員的函數行為
1)有返回值
Easymock.expect(模擬成員的某個要模擬的函數).andReturn(期待的返回值)
2)沒返回值
首先模擬成員調用要模擬的函數,然后在后面跟上一句:EasyMock.expectLastCall(),如果希望為該函數加上一個返回,可以用:
EasyMock.expectLastCall().andAnswer(new IAnswer<任何類型>(){
public String answer() throws Throwable {
log.info(EasyMock.getCurrentArguments()[0]);//打印參數,以確定傳參是否准確([0]表示第一個參數)
return 作何類型;
}
});
因為完全沒返回又沒日志輸出的時候,你可能很難確定這個函數的操作結果是什么
3、模糊參數
有時候要模擬的函數的參數是在程序運行過程中調用的,參數值來自於程序執行結果,這時可以用模糊參數來解決,模糊參數有:
isA、isNull、anyInt等
4、開始測試
EasyMock.replay(模擬成員);
三、實例
1、要測試的類
public class UserServiceImpl{
private UserDao dao;
public List<String> queryNames(String[] ids) throws Exception{
try{
return dao.getNames(ids);
}catch(Exception e){
throw e;
}
return null;
}
}
該類依賴UserDao,但UserDao可能還沒實現,或要靠spring容器來注入
2、測試代碼
@Test
public void test() {
String[] ids = {'1','2','3'};
List<String> returnNams = Arrays.asList("a,b,c".split(","));
UserDao userDaoMock = EasyMock.createMock(UserDao.class);//創建模擬成員
EasyMock.expect(userDaoMock.getNames(ids )).andReturn(returnNams);
EasyMock.replay(userDaoMock );//重放Mock對象
UserServiceImpl userServiceImpl = new UserServiceImpl();
userServiceImpl .queryNames(ids);//目標類調用目標方法
EasyMock.verify(userDaoMock );//驗證Mock對象
}