清單 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 中可以看出,沒有任何特別神奇的地方 — 有嗎?
文章來源于領測軟件測試網 http://www.kjueaiud.com/