针对 :横切规范和功能
概述 :上一个 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);
}
不过,可以想像为更复杂的匹配情况(例如,somePointcut() && ! cflowbelow(somePointcut()))创建一个类似的 mock 目标。可视化工具不能给出关于使用运行时检查的切点(如 cflow())的匹配的详细信息。用几个代表性的 mock 目标检查这种切点是值得的。
结束语
当我看到未测试的代码时,就觉得厌烦。没有好的测试集的代码通常有很多问题,难于进行有信任度的改变,并且难以重构。不过,如果用方面实现横切行为,那么就有了测试(并理解)应用程序的横切关注点的新方法。
测试方面与测试对象很相似。这两种测试都需要将行为分解为可以单独测试的组件。一个要掌握的关键概念是横切关注点分为两个区域。首先是横切规范,它要回答的是关注点影响的是程序的哪些部分。其次是功能,它回答的是这些点上会发生什么。如果只使用对象,那么这两个区域是交叉的,因为关注点在应用程序中是纠缠在一起的。不过,使用了方面后,可以以一个领域为目标或者同时分别以两个领域为目标。
将方面编写为可测试的,得到的设计好处与通过重构面向对象的代码来实现可测试性所得到的好处相似。例如,如果将建议的正文转移到一个可独立测试的类中,那么就可以分析其行为而不用理解它横切应用程序的方式。如果修改切点以使它们更能被 mock 目标访问,也就使它们更可被系统中的非测试部分访问。不管是哪种情况,都提高了系统整体的灵活性和可插入性。
不久之前,我听到了一个流传的说法,说面向方面的程序不能测试。尽管这个谣传基本上已经消失,我仍然认为它是一个挑战。我希望本文表明不仅可以对方面进行测试,而且在测试横切时,使用了方面后会好得多。
致谢
Ron Bodkin、Wes Isberg、Gregor Kiczales 和 Patrick Chanezon 对本文贡献良多,他们审阅了初稿并提供了有益的意见和修改。
下载
描述 名字 大小 下载方法
Article source: Eclipse 3.1/AJDT 1.3 project j-aopwork11-source.zip 337 KB FTP
文章来源于领测软件测试网 https://www.ltesting.net/