2016-03-06 50 views
2

我是TDD的忠實粉絲,我通常會在編寫代碼之前爲我的大學作業編寫測試用例。因此,這裏是我的任務的接口:如何使用JUnit單元測試鏈表

public interface SinglyLinkedList<E> { 
    public void insertFirst(E e); 
    public void insertAfter(E e, int index); 
    public void removeFirst(); 
    public void remove(int index); 
    public void removeAll(); 
    public E getFirst(); 
    public E get(int index); 
    public int size(); 
    public String toString(); 
} 

我寫了整個測試用例,但它的感覺就像我寫的不好的測試代碼。我找不到一種方法來編寫我的測試方法atomic。胃內我不能使用size()來測試remove()方法。或者我無法找到一種方法來測試insertFirst()而不調用get()之後。 據我所知,沒有辦法標記testmethods依賴關係嗎?有沒有一種方法可以解決這個問題? 或者你會如何解決這個問題?

+1

我在一個測試方法remove()中使用size()沒有看到任何錯誤:remove()的約定的一部分是如果要移除的對象位於列表中,它必須遞減大小,所以它很自然調用remove()後檢查大小是否正確。 –

+0

請注意,完整的TDD方法會從較小的開始,而不是在未經測試的情況下編寫整個接口。這樣,您可以建立起來,而不用擔心使用其他方法的方法,因爲它們已經過測試和工作。 – jonrsharpe

+0

信息隱藏的重點是限制一個類到公共接口。測試只能確定這個接口*總體上反映了對象的正確,一致的狀態。編寫測試的任務是在不同的星座中找到一組(最少)一組調用,這些調用集中在作爲測試用例的「目標」的各個方法中。 – laune

回答

4

單元測試中的單元不一定是單獨的方法。根據contracts來思考更有用。合同可以是給定某些參數,函數應該返回一定的值,但通常它們更復雜。

例如,有可能是一個合同,指出調用insertFirst後:

  • getFirst返回你插入
  • size回到原來的大小加上一個
  • 對象的toString的輸出包括插入對象

這些將被稱爲合同的後置條件。合同也可能具有先決條件:例如,如果列表爲空,那麼remove應該拋出異常。

當合同需要與外部實體交互時,模擬對象變得有用。這裏情況不同。

+0

嘿喬尼謝謝你的回答,這很有道理。你可以參考一本書,我可以找到關於這個合同概念的更多信息嗎?我用junit命令在java中進行了實用的單元測試。你認爲我能在那裏找到細節嗎? – t0n1ght

+0

「實用程序員」有合同設計章節。這是一本相當不錯的書,我的最愛之一 – Joni