快速业务通道

AOP@Work: 对方面进行单元测试-验证横切行为的八种新模式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
id testHighlightUtilAppliedToTitleOfSearchResult() { mockUtil.expects(once()) .method("highlight") .with(eq("I am a big bear!"), eq(words)); result.getTitle(); } }

AOP@Work: 对方面进行单元测试-验证横切行为的八种新模式(8)

时间:2011-09-07 IBM Nicholas Lesiecki

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(); } }

优缺点

这个模式对前一个模式做了补充,只是它测试方面的横切规范和上下文处理 而不是横切行为。因为不用检查方面的输出的间接副作用,所以可以更容易地产 生联结点匹配和上下文传递行为中的临界用例。

重要的是要认识到委派逻辑的优缺点,用 mock 进行测试对于使用对象或方 面的技术都是类似的。在这两种情况下,都是分离关注点,然后以更隔离的方法 验证每一个关注点。

对于注入 mock 来说,有一个特定于方面的问题。如果使用单元素方面(默 认的),那么对于方面的字段所做的所有改变,如用 mock 替换一个字段,在测 试结束时都必须撤销。(否则,mock 会挂起并可能影响系统的其他部分。)这 种销毁逻辑很难实现和记忆。编写一个测试清理方面,自动在每次测试后像在例 子中那样重新设置方面从概念上来说是简单的,但是其细节超出了本文的范围。

IV. 使用 mock 目标

在最后一节中,我介绍了我自己发明的、用于描述在编写方面测试时用到的 一种测试 helper 类类型的术语:mock 目标。在方面之前的世界中,一个 mock 对象 表示一个(手写或者动态生成)的类,它模仿要测试的一些类的协作器。 与此类似,mock 目标 是一个模仿要测试的一些方面的合法建议目标的类。

为了创建 mock 目标,编写一个与生产中的建议有某些相似结构或者行为的 类。例如,如果对于由 getter 返回的文字的突出显示感兴趣,可以编写下面这 样的一个 mock 目标:

//an inner class of the enclosing test case public class HighlightMockTarget implements Highlightable { public String getSomeString() { return "I am a big bear!"; } }

AOP@Work: 对方面进行单元测试-验证横切行为的八种新模式(9)

时间:2011-09-07 IBM Nicholas Lesiecki

然后,编写测试用例以验证方面正确地与目标交互,如清单 4 所示:

清单 4. 与 mock 目标交互以测试建议

public void setUp() throws Exception { super.setUp(); setUpMockHighlightUtil(); words = Collections.singleton("big"); mockTarget = new HighlightMockTarget(); mockTarget.setHighlightedWords(words); } //mock setup/tearDown omitted public void testHighlighting() { mockUtil.expects(once()) .method("highlight") .with(eq("I am a big bear!"), eq(words)) .will(returnValue("highlighted text")); String shouldBeHighlighted = mockTarget.get

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号