我正在學習Mockito。在開始使用模擬對象之前,我不得不說更像集成測試一些單元測試,所以我有這樣一個setUpBeforeClass(試驗班):Junit/Mockito:選擇運行模擬測試或集成測試
@BeforeClass
public static void setUpBeforeClass() throws Exception {
instance = new UserDataAccess();
instance.setDb(new MyDb());
}
現在用模擬對象是相似的很多,但是設置略微複雜一些:
@BeforeClass
public static void setupBeforeClass throws Exception {
instance = new UserDataAccess();
MyDb myDb = mock(MyDb.class);
when(...).thenReturn(...);
...
instance.setDb(myDb);
}
而且我有一個測試套件,用於在運行測試之前加載DB在一個衆所周知的狀態,這是由稱爲第一類測試完成該套件。
我在想,我不應該扔掉集成測試,所以我正在考慮將測試套件分成一個UnitTestSuite和一個IntegrationTestSuite。事實上,模擬測試並沒有測試所有的東西,例如他們不測試查詢是否正確。
此外,這兩個套件之間的唯一區別將是初始DB重置和setUpBeforeClass()代碼。複製和更改所有測試類只是爲了更改方法是浪費。初始DB重置很容易跳過,我只是沒有在單元測試套件中包含db重置測試類。
要拆分單元和集成測試你有什麼建議?擴展所有原始類以覆蓋靜態方法,然後在套件中包含正確的類?
還是其他方法?你是怎麼做的,或者你會怎麼做?
Upvoted爲關於'測試蠕變'的段落。集成測試和單元測試通常在使用模擬方面有所不同,單元測試涵蓋單一類合同,集成測試覆蓋(部分)用例與整個系統。 –
謝謝Derek,所以在實踐中你說的是,運行與集成和單元測試相同的測試可能不是一個好主意,只是重複一種方法,因爲我會錯過測試的不同重點,而我或許過度設計了測試,所以我不妨將其與一些代碼重複進行交換。它是否正確? – stivlo
是的,差不多。我確信有些人會不同意代碼重複,但如果有助於保持清晰的話,我不介意有點重複。它非常依賴於你的測試。如果你無法花費30分鐘時間來閱讀和理解它們,那麼它們就太複雜了。另一方面,如果在包含單元測試的類中看到4次或5次相同的設置,則可能將其重構爲抽象或setup()方法。正如我所說,這是一個基於代碼的個人通話。最好的指南是KISS。 – drekka