2017-09-11 81 views
1

我有一個服務層和一個領域層。我使用普通的本地Spring存儲庫作爲域層,在我的測試設置中,我使用dbunit來嘲弄數據庫。服務層測試:使用dbUnit時是否還在進行單元測試,而不是模擬原生的Spring域層?

@Repository 
public interface ExampleRepository extends PagingAndSortingRepository<ExampleEntity, Long>, JpaSpecificationExecutor<ExampleEntity> { 
} 

當然我會假設Spring存儲庫實現沒有錯誤,因此域圖層不受測試。

我對單元測試的一般知識是,在爲我的服務層編寫單元測試時,我需要模擬我的域層。

我假設領域層不需要測試,而事實上,我用dbunit來模擬我的數據庫,我可以使用這個設置來對我的服務層進行單元測試嗎?

回答

1

如果我正確地理解了它,在你的測試中,Spring上下文被增強,你的服務層和你的域層一起被測試,並且數據被使用DBUnit插入到測試數據庫中。

就這樣,讓我們​​開始:

我對單元測試的常識是,我需要爲我的業務層編寫單元測試時,嘲笑我的域名層。

如果你想做一個單元測試,那麼這是正確的。您描述測試的方式取決於兩個層次是否正確,並且數據庫必須運行,因此按定義它們是集成測試。

隨着我的假設是,領域層並不需要進行測試,並與事實,我使用DbUnit嘲笑我的數據庫,我是允許使用此設置爲我服務層的單元測試?

我不會打電話給DBunit使用數據庫模擬。它肯定有助於填充數據庫,但仍然需要數據庫來運行測試,並且將執行域層(JPA,Hibernate或任何ORM框架將生成將針對數據庫執行的SQL)。如果你真的想嘲笑領域層和數據庫,那麼你應該考慮使用模擬(許多模擬庫可以幫助這一點)。

至於最後一個問題,那麼,如果這種設置正在爲您的項目,我想這是好的,但我不會把它單元測試,但集成測試。你必須接受,如果你的域名層出於某種原因改變了,它可能會破壞你的服務層測試。

這兩種方法都有優點和缺點(單元與集成)。如果它可以幫助您以高質量和良好的維護性來發展項目,那麼就沒有「正確」或「錯誤」的方法。

+0

謝謝,是的,你正確地理解了一切。是的,我看到了這個問題。我想我會嘲笑域圖層並進行乾淨的單元測試。這樣,測試類也看起來更清潔。無論如何,我將通過我的REST界面進行集成測試。假設,在使用整個春天環境時它仍然是一個單元測試嗎? –

+0

如果我不得不使用spring context,我傾向於說它仍然是一個集成測試。在我對Spring的經驗中,我已經能夠在服務層上編寫單元測試,而不需要提高上下文,但我不會在這個問題上着迷。通常我使用基於構造函數的注入,創建類並在創建類時通過模擬更容易。最後,如果你可以有效地模擬其他層,它將主要作爲一個單元測試。 –

1

不,用dbUnit進行測試就是集成測試。

  • 單元測試只涉及測試中的小代碼單元,嘲笑任何其他交互。
  • 集成測試涉及使用外部服務的系統範圍更廣,如使用數據庫服務器測試SQL並使用電子郵件服務器發送電子郵件。在這兩種情況下,我們都使用「測試雙打」而不是真正的生產測試來驗證系統是否與外部服務正確交互。

有很多測試類型,我看到和實現的最常見的是單元,集成,驗收和性能。所有都是有價值的,並有不同的優點/缺點。最好有一個質量體系的所有類型。

相關問題