清单 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();
}
}
优缺点
这个模式对前一个模式做了补充,只是它测试方面的横切规范和上下文处理而不是横切行为。因为不用检查方面的输出的间接副作用,所以可以更容易地产生联结点匹配和上下文传递行为中的临界用例。
文章来源于领测软件测试网 https://www.ltesting.net/