的改變變得困難了。在真實世界中,橫切比較工具可以有很多配置,對某些方面的改變發出警報,而忽略與其他方面有關的改變。
III. 使用委派
方面可以并且通常用普通對象實現橫切行為?梢岳眠@種關注點的分離分別測試橫切規范及它們的行為。下面兩個模式展示如何使用委派和 mock 對象檢查方面的這兩個部分。
模式 1. 測試委派的建議邏輯
針對 :橫切功能
概述 :如果還沒有做的話,可以將一些或者全部建議邏輯委派給其他可以直接測試的類。(如果愿意的話,還可以將行為委派給方面的公共方法。)
例子:將突出顯示邏輯轉移到其他類
要更好地在隔離狀態下測試突出顯示邏輯,可以將它轉移到一個專門的工具類中:
private HighlightUtil highlightUtil = new CssHighlightUtil();
public void setHighlightUtil(HighlightUtil highlightUtil){
this.highlightUtil = highlightUtil;
}
String around(Highlightable highlightable) :
highlightedTextProperties() && this(highlightable)
{
String result = proceed(highlightable);
return highlightUtil.highlight(result, highlightable.getHighlightedWords());
}
通過抽取突出顯示邏輯,可以編寫調用 HighlightUtil 類的方法的單元測試。
優缺點
這項技術使得在域邏輯中產生邊緣用例更容易了。它還有助于隔離問題,如果 helper 類的測試失敗,就會知道是它而不是方面有問題。最后,委派邏輯通常會得到更干凈的關注點分離。在這個例子中,通過將文字突出顯示邏輯抽取到其它類,它變成系統其他部分可以獨立于這個方面使用的一項操作。從而使方面獲得了使用不同的突出顯示策略的靈活性(HTML 的 CSS 突出顯示、純文本的全部大寫突出顯示等等)。
不利的一面是,這種技術在邏輯難于抽取時就無能為力了。例如,最好讓簡單的邏輯留在原處。同時,一些方面將狀態存儲到本地或者它們建議的類的 ITD 中。狀態存儲通常構成了方面邏輯的簽名部分,它并不總能干凈地轉移到 helper 類中。
模式 2. 使用模擬對象記錄建議觸發
針對 :橫切規范和功能
概述 :這項技術補充了前一項技術。如果將建議行為抽取到另一個類中,那么就可以用一個 mock 對象替代 helper 類對象,并驗證建議是否在正確的聯結點上觸發。還可以驗證建議將正確的上下文傳遞給了 helper 類,不管是直接用建議參數還是用之前存儲的狀態。
注: 如果需要對 mock 對象的介紹,請參閱 參考資料。
例子:用一個 mock HighlightUtil 測試 Highlighter 方面
我們已經看到了方面如何委派到另一個類中以處理實際的文字突出顯示。這使得在測試中向方面注入不同的 highlighter 實現成為可能。清單 3 中的代碼利用 JMock 庫做到了這一點。(請參閱 參考資料。)
文章來源于領測軟件測試網 http://www.kjueaiud.com/