快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
可以编写切点以部分根据 Java 5.0 元数据进行匹配。例如,下面修改后 的切点匹配用 @Highlighted 注释修饰的方法执行:

public pointcut HighlightedTextProperties() : execution(@Highlighted public String Highlightable+.*()); //you can apply the annotation in the source, or using the declare- annotation form declare @method : public String SearchResult+.getTitle(..) : @Highlighted; declare @method : public String SearchResult+.getProduct(..) : @Highlighted;

可以通过添加注释到其 getSomeString() 方法,使 mock 目标匹配新的切点 :

@Highlighted public String getSomeString() { return "I am a big bear!"; }

优缺点

这项技术还明确地分离了对方面行为与目标应用程序的行为的测试,使测试 变为更独立。如果切点还没有编写为容纳 mock 目标,那么应当通过重新编写它 们得到一个耦合更松散的方面。通过使方面足够一般化,可以影响测试类中的 mock 目标,还会保证它可以容易地让真实类参与方面的行为。

模式 3. 验证更复杂的切点(一个特殊情况)

针对 :横切规范和功能

概述 :上一个 mock 目标是简单的,但是也可以将 mock 目标编写为模拟复 杂的联结点(如 cflow())或者要影响的一系列联结点。

例子:模拟 cflow

假定希望对于下载的报告关闭突出显示。可以加入一个 highlightExceptions切点以排除由 ReportGenerator 调用的任何 getter,如 下所示:

public pointcut highlightedTextProperties() : execution(public String Highlightable+.get*()) && !highlightExceptions(); public pointcut highlightExceptions() : cflow(execution(* ReportGenerator+.*(..)));

然后可以编写一个 mock ReportGenerator,它调用 HighlightMockTarget 以测试没有进行突出显示:

private class MockGenerator implements ReportGenerator { public void write(OutputStream stream) throws IOException { mockTarget.getSomeString(); } } public void testNoHighlight() throws Exception { mockUtil.expects(never()).method("highlight"); MockGenerator accessor = new MockGenerator(); accessor.write(null); }

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

时间:2011-09-07 IBM Nicholas Lesiecki

不过,可以想像为更复杂的匹配情况(例如,somePointcut() && ! cflowbelow(somePointcut()))创建一个类似的 mock 目标。可视化工具不能给 出关于使用运行时检查的切点(如 cflow())的匹配的详细信息。用几个代表性 的 mock 目标检查这种切点是值得的。

结束语

当我看到未测试的代码时,就觉得厌烦。没有好的测试集的代码通常有很多 问题,难于进行有信任度的改变,并且难以重构。不过,如果用方面实现横切行 为,那么就有了测试(并理解)应用程序的横切关注点的新方法。

测试方面与测试对象很相似。这两种测试都需要将行为分解为可以单独测试 的组件。一个要掌握的关键概念是横切关注点分为两个区域。首先是横切规范, 它要回答的是关注点影响的是程序的哪些部分。其次是功能,它回答的是这些点 上会发生什么。如果只使用对象,那么这两个区域是交叉的,因为关注点在应用 程序中是纠缠在一起的。不过,使用了方面后,可以以一个领域为目标或者同时 分别以两个领域为目标。

将方面编写为可测试的,得到的设计好处与通过重构面向对象的代码来实现 可测试性所得到的好处相似。例如,如果将建议的正文转移到一个可独立测试的 类中,那么就可以分析其行为而不用理解它横切应用程序的方式。如果修改切点 以使它们更能被 mock 目标

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