AOP@Work: 设计切入点来避免模式密集 - 编程入门网
在运行的时候,结果处理 通知就会在装置处理通知之前运行,可以调用 proceed(..) 来运行后者,最后再 收回控制权。下面是运行时的顺序:
如果需要,可以显式控制两个通知的优先级,不论通知是否在相同或不同的方 面中,甚至是来自其他方面。在这里因为顺序决定了装置错误是否作为测试错误 报告的设计决策,可能希望显式设置优先级。我也可以使用单独的方面声明装置 错误的处理策略:
这两个 Handling 方面不需要知道对方的存在,而两个 JUnit 类 TestResult 与 TestCase,必须就谁首先运行命令达成一致。如果以后要改变这种设计,只需 要修改 ReportingFixtureErrors 即可。 Collecting Parameter 的可用性 多数 JUnit 测试开发人员都不直接使用 TestResult,就是说在调用链的每个 方法中要作为参数来传递它,Gamma 和 Beck 称之为“签名污染”。相反,他们 提供了 JUnit 断言来通知失效或者展开测试。 TestCase 扩展了 Assert,后者定义了一些有用的 static assert {something}(..) 方法,以检查和记录失效。如果断言失败,那么这些方法将抛 出 AssertionFailedError,TestResult 在结果处理装置模板方法中捕获这些异 常并进行解释。这样,JUnit 就巧妙地回避了 API 用户来回传递收集参数的关注 点,让用户忘掉了 TestResult 的要求。JUnit 将结果报告关注点和验证与日志 服务捆绑在了一起。 捆绑 捆绑使用户更难于选择需要的服务。可以使用 Assert.assert{something} (..) 将 TestCase 绑到 TestResult 上,进一步限制收集参数的灵活性。这样对 测试增加了失效实时处理(fast-fail)语义, 即使有些测试可能希望在确认失 效后继续执行。为了直接报告结果, JUnit 测试可以实现 Test,但这样就失去 了 TestCase 的其他特性(可插接的选择器、装置处理、重新运行测试用例等) 。 这是模式密集的另一个代价:API 用户常常被迫接受或者拒绝整个包。另外, 虽然将问题捆绑到一起可能比较方便,但有时候会降低可用性。比如,很多类或 方法常量首先作为 JUnit 断言写入,如果不自动触发异常这些常量,则可以在产 品诊断中重复使用它们。 如上所述,AspectJ 可以支持 JUnit 断言风格的结果处理,但能否在支持希 望得到直接结果收集的灵活性的 API 用户的同时,又单独决定何时展开测试呢? 甚至允许用户定义自己的结果收集器报告中间结果?我认为能够做到。这一种解 决方案包括四部分:(1) 支持结果收集器的工厂;(2)组件在不污染方法签名的情 况下使用结果收集器;(3) 可以在直接报告给结果收集器后展开测试;(4) 保证 正确报告抛出的异常。撰写 Cook''s Tour 的时候这些还很难做到这些,但是现在 有了新的 Java API 和 AspectJ,所以这一切都变得很容易。 AOP@Work: 设计切入点来避免模式密集(7)时间:2011-09-04 IBM Wes IsbergThreadLocal 收集器 为了让所有组件都能使用结果收集器和实现工厂,我使用了一个公共静态方法 来获得线程本地(thread-local)结果收集器。下面是 TestContext 结果收集器 的框架:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |