我們應該測試 DAO 層嗎?

2022-07-18 21:00:51

應該測試 DAO 層嗎?

網上有很多人討論單元測試是否應該包含 DAO 層的測試。筆者覺得,對於一些主要是crud的業務來說,service層和controller層都會非常薄,而主要的邏輯都落在mapper上。這時候對service層和controller層寫單測沒有太多意義。可以只寫mapper層的單測。

另一方面,mapper層的測試可以有效地避免一些低階的sql錯誤。

定義單測

單元測試是隻針對一個單元的測試,比如說,一個 Service 類的一個每個公共函數。而這個函數所有呼叫了外部依賴的地方都需要被隔離,比如說外部類的依賴,或者是請求了某個伺服器。
也就是說單元測試僅僅是測試當前類的某個函數本身的邏輯,而不涉及到外部的邏輯。因此執行單測應該是很快速的。

在 Java 中單測常用的依賴主要分為測試框架與 Mock 框架。測試框架就是執行和管理測試方法的框架,一般用 JUnit。而 Mock 框架就是用於模擬外部依賴,將被測試的函數的所有外部依賴全部隔離。

一些誤區

在網上見到太多的單測教學,寫得一塌糊塗。甚至連單測的概念都搞不清楚就發表文章,真的是誤人子弟。
關於常見的誤區,這篇部落格列舉得很到位: 如何寫好單元測試:Mock 脫離資料庫+不使用@SpringBootTest

最關鍵的一點是不要使用 @SpringBootTest(classes=XXXApplication.class) 註解測試類。這樣會直接啟動一個 springboot 程序,對稍微複雜一點的專案就至少要花 1 分鐘以上來執行了。如果專案使用了遠端設定中心,SOA 等中介軟體,那建議出去泡杯茶