清單 3. 用 JMock 測試來自方面的調用
public class DelegatedHighlightingUnitTest extends MockObjectTestCase {
Collection
private HighlightUtil original;
private SearchResult result;
private Mock mockUtil;
public void setUp() throws Exception {
super.setUp();
setUpMockHighlightUtil();
words = Collections.singleton("big");
result = new SearchResult();
result.setTitle("I am a big bear!");
result.setHighlightedWords(words);
}
private void setUpMockHighlightUtil() {
original = HighlightResults.aspectOf().getHighlightUtil();
mockUtil = mock(HighlightUtil.class);
HighlightResults.aspectOf().setHighlightUtil((HighlightUtil)mockUtil.proxy());
}
public void testHighlightUtilAppliedToTitleOfSearchResult() {
mockUtil.expects(once())
.method("highlight")
.with(eq("I am a big bear!"), eq(words));
result.getTitle();
}
}
setUp() 方法實例化 mock 對象并將它注入到方面中。測試方法告訴 mock 等待對名為 “highlight” 的方法的調用,這個方法有兩個參數:getTitle() 的返回值和在 SearchResult 中存儲的單詞清單。設置了期望后,測試調用 getTitle() 方法,它應當觸發方面并產生預期的對 mock 的調用。如果 mock 沒有收到調用,那么它就會在銷毀時自動使測試失敗。
注意 setUp() 方法存儲了到原來 HighlightUtil 的引用。這是因為方面像大多數對象一樣,是單元素(singleton)的。因此,銷毀時撤銷 mock 注入的影響很重要,否則,mock 會持續留在方面中并影響其他測試。這個方面的正確銷毀如下所示:
@Override
protected void tearDown() throws Exception {
try {
HighlightResults.aspectOf().setHighlightUtil(original);
} finally {
super.tearDown();
}
}
優缺點
這個模式對前一個模式做了補充,只是它測試方面的橫切規范和上下文處理而不是橫切行為。因為不用檢查方面的輸出的間接副作用,所以可以更容易地產生聯結點匹配和上下文傳遞行為中的臨界用例。
文章來源于領測軟件測試網 http://www.kjueaiud.com/