2008-12-11 119 views

回答

6

我一般看到兩種情況與存儲庫。我要求一些東西,然後我得到它,或者我要求一些東西,但它不在那裏。

如果您正在模擬您的存儲庫,那意味着您正在測試的系統(SUT)是使用您的存儲庫的東西。所以你通常想要測試你的SUT在從存儲庫中給出一個對象時的行爲是否正確。而且你也想測試一下,當你希望得到某些東西時,它會正確地處理這種情況,而不是,或者不確定是否會返回某些東西。

如果您正在進行集成測試,硬編碼測試雙打也可以。說,你想保存一個對象,然後把它拿回來。但是,這是測試兩個對象的相互作用,而不僅僅是SUT的行爲。他們是兩個不同的東西。如果你開始編寫僞代碼庫,那麼你也需要對這些代碼進行單元測試,否則你最終會將代碼的成功和失敗的基礎放在未經測試的代碼上。

這是我對嘲笑與測試雙打的看法。

0

我假設你的意思是「存儲庫」DAO;如果不是,那麼這個答案將不適用。最近,我一直在做DAO的「內存」,「模擬」(或測試)實現,這些實現基本上是通過傳遞給模擬構造函數的數據(List,Map等)來實現的。通過這種方式,單元測試類可以隨意地插入測試所需的任何數據,可以改變它等,而不用強制所有在「內存」DAO上運行的單元測試都被編碼爲使用相同的測試數據。

另外,我在這種方法中看到的是,如果我有一打單元測試需要使用相同的DAO進行測試(例如注入被測類),我不需要記住每次測試數據的所有細節(如果「模擬」是硬編碼的話) - 單元測試自己創建測試數據。不足之處在於,這意味着每個單元測試都需要花費幾條線創建並連接測試數據;但這對我來說是一個小缺點。

A碼例如:

public interface UserDao { 
    User getUser(int userid); 
    User getUser(String login); 
} 

public class InMemoryUserDao implements UserDao { 

    private List users; 

    public InMemoryUserDao(List users) { 
     this.users = users; 
    } 

    public User getUser(int userid) { 
     for (Iterator it = users.iterator(); it.hasNext();) { 
      User user = (User) it.next(); 
      if (userid == user.getId()) { 
       return user; 
      } 
     } 

     return null; 
    } 

    public User getUser(String login) { 
     for (Iterator it = users.iterator(); it.hasNext();) { 
      User user = (User) it.next(); 
      if (login.equals(user.getLogin())) { 
       return user; 
      } 
     } 

     return null; 
    } 
} 
+0

我的意思是存儲庫模式。我通過鏈接到Martin Fowler的定義編輯了這個問題。 – 2008-12-11 15:32:50

6

SCNR:「?!你把自己當成倉庫我見過火柴盒容量更大的」

+0

這是我在閱讀問題時首先想到的:-) – Ferruccio 2008-12-11 16:48:34