快速业务通道

追求代码质量 - 亲身体验行为驱动开发 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
类的模式 。在那种情况下,覆盖是通过 GWT 的 Timer 类实现的。

如果现在运行清单 3 中的行为,应该看到出现错误。按照目前编写的代码, push() 方法不执行任何操作。所以不可能生成异常,从清单 4 中的输出可以看 到这一点。

清单 4. 没有发生期望的行为

1) StackBehavior should throw  exception upon null push: VerificationException: Expected: object not null but got: null:

清单 4 中的句子 “StackBehavior should throw exception upon null push” 模拟行为的名称(shouldThrowExceptionUponNullPush()),并加上类 的名称。实际上,JBehave 是在报告当它运行所需的行为时,没有获得任何反应 。当然,我的下一步是要使上述行为成功运行,为此我检查 null,如清单 5 所 示。

清单 5. 在栈类中增加指定的行为

public void push(E value)  {   if(value == null){    throw new RuntimeException("Can''t push null");   } }

当我重新运行行为时,一切都运行得很好,如清单 6 所示。

清单 6. 成功!

Time: 0.021s  Total: 1. Success!

行为驱动开发

清单 6 中的输出与 JUnit 的输出是不是很像?这也许不是巧合,对不对? 如前所述,JBehave 是根据 xUnit 范例建模的,它甚至通过 setUp() 和 tearDown() 提供了对 fixture 的支持。由于我可能在整个行为类中使用一个 Stack 实例,我可能也会将那种逻辑推入(这里并非有意使用双关语)到一个 fixture 中,正如清单 7 中那样。注意, JBehave 将与 JUnit 一样遵循相同 的 fixture 规则 — 也就是说,对于每个行为方法,它都运行一个 setUp() 和 tearDown()。

清单 7. JBehave 中的 fixture

public class StackBehavior  {   private Stack<String> stStack;   public void setUp() {   this.stStack = new Stack<String>();   }   //... }

对于接下来的行为方法,shouldThrowExceptionUponPopWithoutPush() 表示 我必须确保它具有类似于 清单 3 中的 shouldThrowExceptionUponNullPush() 的行为。从清单 8 中可以看出,没有任何特别神奇的地方 — 有吗?

清单 8. 确保 pop 的行为

public void  shouldThrowExceptionUponPopWithoutPush() throws Exception{   Ensure.throwsException(RuntimeException.class, new Block()  {    public void run() throws Exception {    stStack.pop();    }   }); }

您可能已经清楚地知道,此时清单 8 并不会真正地编译,因为 pop() 还没 有被编写。但是,在开始编写 pop() 之前,让我们考虑一些事情。

追求代码质量 - 亲身体验行为驱动开发(4)

时间:2010-12-12 IBM Andrew Glover

确保行为

从技术上讲,在这里我可以将 pop() 实现为无论调用顺序如何,都只抛出一 个异常。但是当我沿着这条行为路线前进时,我又忍不住考虑一个支持我所需要 的规范的实现。在这种情况下,如果 push() 没有被调用(或者从逻辑上讲,栈 为空)的情况下确保 pop() 抛出一个异常,则意味着栈有一个状态。正如之前 Linda 思考的那样,栈通常有一个 “内部容器”,用于实际持有项目。相应地 ,我可以为 Stack 类创建一个 ArrayList,用于保持传递给 push() 方法的值 ,如清单 9 所示。

清单 9. 栈需要一种内部的方式来持有对象

public class  Stack<E> {   private ArrayList<E> list;   public Stack() {   this.list = new ArrayList<E>();   }   //... }

现在我可以为 pop() 方法编写行为,即确保当栈在逻辑上为空时,抛出一个 异常。

清单 10. pop 的实现变得更容易

publ

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