我用Moq來嘲笑我的repositories。然而,最近有人表示他們更喜歡爲他們的存儲庫接口創建硬編碼的測試實現。你如何嘲笑你的知識庫?
每種方法的優缺點是什麼?
編輯:明確了與Fowler鏈接的知識庫的含義。
我用Moq來嘲笑我的repositories。然而,最近有人表示他們更喜歡爲他們的存儲庫接口創建硬編碼的測試實現。你如何嘲笑你的知識庫?
每種方法的優缺點是什麼?
編輯:明確了與Fowler鏈接的知識庫的含義。
我一般看到兩種情況與存儲庫。我要求一些東西,然後我得到它,或者我要求一些東西,但它不在那裏。
如果您正在模擬您的存儲庫,那意味着您正在測試的系統(SUT)是使用您的存儲庫的東西。所以你通常想要測試你的SUT在從存儲庫中給出一個對象時的行爲是否正確。而且你也想測試一下,當你希望得到某些東西時,它會正確地處理這種情況,而不是,或者不確定是否會返回某些東西。
如果您正在進行集成測試,硬編碼測試雙打也可以。說,你想保存一個對象,然後把它拿回來。但是,這是測試兩個對象的相互作用,而不僅僅是SUT的行爲。他們是兩個不同的東西。如果你開始編寫僞代碼庫,那麼你也需要對這些代碼進行單元測試,否則你最終會將代碼的成功和失敗的基礎放在未經測試的代碼上。
這是我對嘲笑與測試雙打的看法。
我假設你的意思是「存儲庫」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;
}
}
我的意思是存儲庫模式。我通過鏈接到Martin Fowler的定義編輯了這個問題。 – 2008-12-11 15:32:50