快速业务通道

AOP@Work: 设计切入点来避免模式密集 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
estContext>();  /** Clients call this to get test context */  public static TestContext getTestContext(Object test) {   ...    }  ... }  

方法 getTestContext(Object test) 可支持结果收集器和测试之间的不同联 系(每个测试、每个套件、每个线程、每个 VM),但 TestContext 的子类型需 要向下强制转换,不支持其他类型。

展开测试

抛出异常不仅要展开测试,还将报告错误。如果测试客户机直接使用 getTestContext(..) 通知错误,那么需要展开测试而不是报告更多的错误。为此 ,需要声明一个专门的异常类,指出已经告知结果。API 契约方式需要定义抛出 异常的客户机和捕捉异常的装置都需要知道的类。为了向客户机隐藏类型细节, 可以像下面这样声明一个返回用户抛出的异常的方法:

public class TestContext {  ...  public Error safeUnwind() {   return new ResultReported();  }  private static class ResultReported extends Error {} }

然后测试抛出 TestContext 定义的所有异常:

 public void testClient() {   ...   TestContext tc = TestContext.getTestContext(this);   tc.addFailure(..);    ..   throw tc.safeUnwind(); // could be any Error  } }

这样就把测试和 TestContext 绑定到了一起,但是 safeUnwind() 仅供那些 进行自己的结果报告的测试使用。

AOP@Work: 设计切入点来避免模式密集(8)

时间:2011-09-04 IBM Wes Isberg

保证异常被报告

下面是为 TestContext 收集结果的通知。这个通知具有足够的通用性,可用 于不同的测试用例和不同的 TestContext 子类型:

/** Record for each test start and end or exception */ void around() : testCase() {  ITest test = wrap(getTest (thisJoinPoint));  TestContext testContext = TestContext.getTestContext(test);  testContext.startTest(test);  try {   proceed();   testContext.endTest(test);  } catch (ResultReported thrown) {   testContext.checkReported (test);  } catch (Error thrown) {   testContext.testError (test, null, thrown);  } catch (Throwable thrown) {    testContext.testFailure(test, null, thrown);  } } protected abstract Object getTest(JoinPoint jp);

因为该通知加强了 TestContext 的不变性,所以我把这个方面嵌套在 TestContext 中。为了让装置开发人员指定不同的测试用例,切入点和方法都是 抽象的。比如,下面将其用于 TestCase:

aspect ManagingJUnitContext  extends TestContext.ManagingTestResults {  public pointcut testCase() : within(testing.junit..*)   && execution(public !static void TestCase+.test*());  protected Object getTest(JoinPoint jp) {   assert jp.getTarget() instanceof TestCase;   return jp.getTarget();  } }

我在一个重要的地方限制了这一解决方案:around 通知声明它返回 void。如 果我声明该通知返回 Object,就可以在任何连接点上使用该通知。但是因为要捕 获异常需要正常返回,我还需要知道返回的是什么 Object。我可以返回 null 然 后等待好消息,但我更愿意向任何子方面表明该问题,而不是等它在运行时抛出 NullPointerException。

虽然声明 void 限制了 testCase() 切入点的应用范围,但是这样降低了复杂 性,增强了安全性。 AspectJ 中的通知具有和 Java 语言中的方法相同的类型安 全和异常检查。通知可以声明它抛出了一个经过检查的异常,如果切入点选择了 不抛出异常的连接点,那么 AspectJ 将报告错误。类似地,around 通知可以声 明一个返回值(

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