清單 23. 返回 null 并不奇怪,對嗎?
1) StackBehavior should leave value on stack after peep:
VerificationException: Expected:
same instance as <test 2>
but got:
null:
在邏輯上,peek() 不會從內部集合中移除 項目,它只是傳遞指向那個項目的指針。因此,我將對 ArrayList 使用 get() 方法,而不是 remove() 方法,如清單 24 所示。
清單 24. 不要移除它
public E peek() {
return this.list.get(this.list.size()-1);
}
棧為空的情況
現在重新運行 清單 21 中的行為,結果順利通過。但是,在這樣做的過程中發現一個問題:如果棧為空,則 peek() 有怎樣的行為?如果說棧為空時調用 pop() 會拋出一個異常,那么 peek() 是否也應該如此?
Linda 對此沒有進行解釋,所以,顯然我需要自己添加新的行為。在清單 25 中,我為 “當之前沒有調用 push() 時調用 peek() 會怎樣” 這個場景編寫了代碼。
清單 25. 如果沒有調用 push 就調用 peek,會怎樣?
public void shouldReturnNullOnPeekWithoutPush() throws Exception{
Ensure.that(stStack.peek(), m.is(null));
}
同樣,不會感到意外。如清單 26 所示,問題出現了。
清單 26. 沒有可執行的內容
1) StackBehavior should return null on peek without push:
java.lang.ArrayIndexOutOfBoundsException: -1
修復這個缺陷的邏輯類似于 pop() 的邏輯,如清單 27 所示。
清單 27. 這個 peek() 需要做一些修復
public E peek() {
if(this.list.size() > 0){
return this.list.get(this.list.size()-1);
}else{
return null;
}
}
文章來源于領測軟件測試網 http://www.kjueaiud.com/