快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
配 置,对某些方面的改变发出警报,而忽略与其他方面有关的改变。

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

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

时间:2011-09-07 IBM Nicholas Lesiecki

通过抽取突出显示逻辑,可以编写调用 HighlightUtil 类的方法的单元测试 。

优缺点

这项技术使得在域逻辑中产生边缘用例更容易了。它还有助于隔离问题,如 果 helper 类的测试失败,就会知道是它而不是方面有问题。最后,委派逻辑通常 会 得到更干净的关注点分离。在这个例子中,通过将文字突出显示逻辑抽取到其它 类,它变成系统其他部分可以独立于这个方面使用的一项操作。从而使方面获得 了使用不同的突出显示策略的灵活性(HTML 的 CSS 突出显示、纯文本的全部大 写突出显示等等)。

不利的一面是,这种技术在逻辑难于抽取时就无能为力了。例如,最好让简 单 的逻辑留在原处。同时,一些方面将状态存储到本地或者它们建议的类的 ITD 中 。状态存储通常构成了方面逻辑的签名部分,它并不总能干净地转移到 helper 类中。

模式 2. 使用模拟对象记录建议触发

针对 :横切规范和功能

概述 :这项技术补充了前一项技术。如果将建议行为抽取到另一个类中,那 么就可以用一个 mock 对象替代 helper 类对象,并验证建议是否在正确的联结 点上触发。还可以验证建议将正确的上下文传递给了 helper 类,不管是直接用 建议参数还是用之前存储的状态。

注: 如果需要对 mock 对象的介绍,请参阅 参考资料。

例子:用一个 mock HighlightUtil 测试 Highlighter 方面

我们已经看到了方面如何委派到另一个类中以处理实际的文字突出显示。这 使 得在测试中向方面注入不同的 highlighter 实现成为可能。清单 3 中的代码利 用 JMock 库做到了这一点。(请参阅 参考资料。)

清单 3. 用 JMock 测试来自方面的调用

public class DelegatedHighlightingUnitTest extends MockObjectTestCase { Collection<String> words; 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 vo

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号