亚洲好骚综合-亚洲黄色录像-亚洲黄色网址-亚洲黄色网址大全-99久久99久久-99久久99久久精品国产

您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 >
使用模仿對象Mock object進行單元測試
作者:網絡轉載 發布時間:[ 2013/3/11 17:02:30 ] 推薦標簽:

模仿對象(Mock object)是為起中介者作用的對象編寫單元測試的有用方法。測試對象調用模仿域對象(它只斷言以正確的次序用期望的參數調用了正確的方法),而不是調用實際域對象。然而,當測試對象必須創建域對象時,我們面臨一個問題。測試對象如何知道創建模仿域對象,而不是創建實際域對象呢?在本文中,軟件顧問 Alexander Day Chaffee 和 William Pietri 將演示一種重構技術,該技術根據工廠方法設計模式來創建模仿對象。

單元測試已作為軟件開發的“佳實踐”被普遍接受。當編寫對象時,還必須提供一個自動化測試類,該類包含測試該對象性能的方法、用各種參數調用其各種公用(public)方法并確保返回值是正確的。

當您正在處理簡單數據或服務對象時,編寫單元測試很簡單。然而,許多對象依賴基礎結構的其它對象或層。當開始測試這些對象時,實例化這些合作者(collaborator)通常是昂貴的、不切實際的或效率低的。

例如,要單元測試一個使用數據庫的對象,安裝、配置和發送本地數據庫副本、運行測試然后再卸裝本地數據庫可能很麻煩。模仿對象提供了解決這一困難的方法。模仿對象符合實際對象的接口,但只要有足夠的代碼來“欺騙”測試對象并跟蹤其行為。例如,雖然某一特定單元測試的數據庫連接始終返回相同的硬連接結果,但可能會記錄查詢。只要正在被測試的類的行為如所期望的那樣,它將不會注意到差異,而單元測試會檢查是否發出了正確的查詢。

夾在中間的模仿

使用模仿對象進行測試的常用編碼樣式是:

· 創建模仿對象的實例

· 設置模仿對象中的狀態和期望值

· 將模仿對象作為參數來調用域代碼

· 驗證模仿對象中的一致性

雖然這種模式對于許多情況都非常有效,但模仿對象有時不能被傳遞到正在測試的對象。而設計該對象是為了創建、查找或獲得其合作者。

例如,測試對象可能需要獲得對Enterprise JavaBean(EJB)組件或遠程對象的引用。或者,測試對象會使用具有副作用的對象,如刪除文件的File對象,而在單元測試中不希望有這些副作用。

根據常識,我們知道這種情形下可以嘗試重構對象,使之更便于測試。例如,可以更改方法簽名,以便傳入合作者對象。

在 Nicholas Lesiecki 的文章“Test flexibly with AspectJ and mock objects”中,他指出重構不一定總是合意的,也不一定總是產生更清晰或更容易理解的代碼。在許多情況下,更改方法簽名以使合作者成為參數將會在方法的原始調用者內部產生混淆的、未經試驗的代碼混亂。

問題的關鍵是該對象“在里面”獲得這些對象。任何解決方案都必須應用于這個創建代碼的所有出現。為了解決這個問題,Lesiecki 使用了查找方式或創建方式。在這個解決方案中,執行查找的代碼被返回模仿對象的代碼自動替換。

因為 AspectJ 對于某些情況不是選項,所以我們在本文中提供了一個替代方法。因為在根本上這是重構,所以我們將遵循 Martin Fowler 在他創新的書籍“Refactoring: Improving the Design of Existing Code”(請參閱參考資料)中建立的表達約定。(我們的代碼基于 JUnit — Java 編程的流行的單元測試框架,盡管它決不是 JUnit 特定的。)


重構:抽取和覆蓋工廠方法


重構是一種代碼更改,它使原始功能保持不變,但更改代碼設計,使它變得更清晰、更有效且更易于測試。本節將循序漸進地描述“抽取”和“覆蓋”工廠方法重構。

問題:正在測試的對象創建了合作者對象。必須用模仿對象替換這個合作者。

重構之前的代碼:

class Application {
...
  public void run() {
    View v = new View();
    v.display();
...
 


解決方案:將創建代碼抽取到工廠方法,在測試子類中覆蓋該工廠方法,然后使被覆蓋的方法返回模仿對象。后,如果可以的話,添加需要原始對象的工廠方法的單元測試,以返回正確類型的對象:

重構之后的代碼:

class Application {
...
  public void run() {
    View v = createView();
    v.display();
...
  protected View createView() {
    return new View();
  }
...
}
 


該重構啟用清單1中所示的單元測試代碼:

清單 1. 單元測試代碼

class ApplicationTest extends TestCase {
  MockView mockView = new MockView();
  public void testApplication {
    Application a = new Application() {
      protected View createView() {
        return mockView;
      }
    };
    a.run();
    mockView.validate();
  }
  private class MockView extends View
  {
    boolean isDisplayed = false;
    public void display() {
      isDisplayed = true;
    }
    public void validate() {
      assertTrue(isDisplayed);
    }
  }
}

上一頁123下一頁
軟件測試工具 | 聯系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網站地圖
滬ICP備07036474 2003-2017 版權所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd
主站蜘蛛池模板: 最近2019中文字幕免费版视频 | 国产一区二区三区在线看片 | 人人爱天天做夜夜爽2020麻豆 | 日本欧美强乱视频在线 | 国产精品特黄一级国产大片 | 免费人成网址在线观看国内 | 性美国xxxxx免费 | 1024手机基地在线看手机 | 成人国产在线不卡视频 | xxxx久久| 欧美另类xx | 亚洲欧洲第一页 | 九九色网站| 国产在线高清不卡免费播放 | 欧美精品成人一区二区在线观看 | 免费看一级毛片 | 国产欧美性综合视频性刺激 | 18级成人毛片免费观看 | 制服丝袜手机在线 | 岛国毛片一级一级特级毛片 | 天天干天天操天天 | 在线视频观看你懂的 | 国产啪视频 | 黄色的免费网站 | 无遮挡h肉动漫在线播放内衣 | 香港三级日本三级三级人妇99 | 亚洲黄色片免费看 | 欧美成人一区亚洲一区 | 免费人成年短视频在线观看网站 | 国产精品亚洲日日摸夜夜添 | 性色生活片在色在线观看 | x8x8国产日韩欧美 | 欧美成人久久久免费播放 | 亚洲高清成人 | 黄色的视频网站 | 日本波多野结衣在线 | 伊人婷婷在线 | 男女晚上黄羞羞视频播放 | 日本三级香港三级国产三级 | 黄色香蕉视频 | 禁网站在线观看免费视频 |