AOP@Work: 用Contract4J进行组件设计-用契约式设计和AspectJ改进软件 - 编程入门网
的输入参数不能为空,默认的方法后置条件要求返回值不能为空。
BankAccount 的接口规范包含一个类范围的不变条件测试,即余额总要大于 或 等于 0(对不起,不允许透支)。getBalance() 方法有一个后置条件,即它必 须 返回大于或等于 0 的值。注意,虽然接口不能定义字段,但不变条件测试和其 他 测试引用了一个隐含的余额字段。不过,因为接口定义了对应的 JavaBean 存取 器方法,所以 Contract4J 推导出字段的存在。注意,getBalance() 的后置条 件 测试看起来可能与类的不变条件测试重复,但它只是部分地测试方法会返回余额 这个假设。 合约还有几个前置条件,要求客户传递给 withdraw() 和 deposit() 的参数 大于或等于 0。withdraw() 有额外的前置条件,要求取款的数额不能超过现有 余 额。最后,withdraw() 和 deposit() 有相似的后置条件要求;返回的值必须等 于新余额,新余额必须等于旧余额减去或加上输入的数额。 通用提示 Contract4J 发行版中的 README(请参阅 下面)更详细地讨论了它的语法, 包括已知的限制和特性。发行版中 Contract4J 自己的单元测试提供了有效和无 效的测试表达式的丰富示例。 也可以在类或方面上编写合约测试,在这些类或方面中可以在构造函数上定 义 测试,在实例字段上定义不变条件。(上面的类不变条件实际上就是一个字段不 变条件的规范!)方法和构造函数也可以有不变条件测试。 由于正如组件用户和子类所看到的,合约会影响离散的执行点,所以 Contract4J 把 public、protected 和包可见的方法当成 “原子的”。这意味 着 可以在方法中临时地违反测试,只要在方法完成的时候满足条件即可。注意,对 于带有测试的其他方法或字段的调用也会触发这些测试,所以要有一些特殊情况 的例外,以防止方面代码中的无限递归之类的问题。而且,Contract4J 目前不 允 许在 private 方法上定义测试,因为外部客户看不到这些方法。对静态方法的 测 试也不支持,因为它们不影响对象的状态。但是,在未来的版本中可能会消除这 两个 “理论上的” 限制。 最后,字段的不变条件测试只是在读写字段之后才进行,以便允许惰性计算 。 类似地,字段的不变条件测试从不在对象构造期间进行,但是它们会在构造完成 之后进行。 AOP@Work: 用Contract4J进行组件设计-用契约式设计和AspectJ改进软件(4)时间:2011-09-07 IBMContract4J 的替代 编写契约式设计测试,实际上可以不需要 Contract4J。只要编写自己的方面 (就像在本系列前一篇文章中讨论的那样;请参阅 参考资料)即可。 Contract4J 的优势是没有 AspectJ 经验的开发人员也能使用它;只需要对构建过程做简单 的 修改即可,下面我将讨论这个问题。Contract4J 还提供了非常简洁的定义测试 的 方式,采用熟悉的 Java 构造,不必定义许多额外的 AspectJ “样板文件”。 合 约不仅可以执行,还是用户可见的代码、文档和信息的组成部分,而如果是在分 散的方面中捕获到的,这些信息则会很模糊。 正如前面提到过的,单元测试和契约式设计用不同的方式实现类似的目标。 像 Contract4J 这样的契约式设计工具在单元测试比较分散或比较困难的时候最 有帮助。集成和内置测试,有助于捕获这些经常被更低级的测试忽略的模糊的集 成问题。不论是否使用 Contract4J 进行单元测试,考虑组件的合约都会改进设 计。 Contract4J 在运行时,Contract4J 使用内置的方面建议应该在其中执行测试的连接点。 这些方面中的切入点查找合适的标注。前置条件测试由 before 建议处理,该建 议就在对应的方法执行连接点之前执行。before 建议使用 Apache Jakarta Commons JEXL 解释器把测试字符串中的特殊关键字转换成合适的对象,并计算 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |