棧的邏輯
至此,通過允許傳遞多個行為方法,我已經實現了 push() 和 pop() 方法。但是我還沒有處理棧的實際內容,這是與多個 push() 和 pop() 相關聯的邏輯,間或出現一個 peek()。
首先,我將通過 shouldPopSecondPushedValueFirst() 行為確保棧的基本算法(先進先出)無誤。
清單 19. 確保典型的棧邏輯
public void shouldPopSecondPushedValueFirst() throws Exception{
stStack.push("test 1");
stStack.push("test 2");
Ensure.that(stStack.pop(), m.is("test 2"));
}
清單 19 中的代碼可以按計劃運行,所以我將實現另一個行為方法(在清單 20 中),以確保兩次使用 pop() 都能表現出正確的行為。
清單 20. 更深入地查看棧行為
public void shouldPopValuesInReverseOrder() throws Exception{
stStack.push("test 1");
stStack.push("test 2");
Ensure.that(stStack.pop(), m.is("test 2"));
Ensure.that(stStack.pop(), m.is("test 1"));
}
接下來,我要確保 peek() 能按預期運行。正如 Linda 所說,peek() 遵從和 pop() 相同的規則,但是 “應該保留棧頂的項目”。相應地,我在清單 21 中實現了 shouldLeaveValueOnStackAfterPeep() 方法的行為。
清單 21. 確保 peek 保留棧頂的項目
public void shouldLeaveValueOnStackAfterPeep() throws Exception{
stStack.push("test 1");
stStack.push("test 2");
Ensure.that(stStack.peek(), m.is("test 2"));
Ensure.that(stStack.pop(), m.is("test 2"));
}
由于 peek() 還沒有定義,因此清單 21 還不能編譯。在清單 22 中,我定義了 peek() 的一個最簡單的實現。
清單 22. 當前,peek 是必需的
public E peek() {
return null;
}
現在 StackBehavior 類可以編譯,但是它仍然不能運行。
文章來源于領測軟件測試網 http://www.kjueaiud.com/