[英]Whats the benefit or purpose of unit testing a void method like doFilter?
我在 java tomcat 堆棧上並創建了一個新的過濾器。 https://javaee.github.io/javaee-spec/javadocs/javax/servlet/http/HttpFilter.html我對單元測試很感興趣,因為我想要 100% 的分支覆蓋率。
此過濾器包裝響應對象。 我們覆蓋響應的默認行為,這樣每當我們調用 response.addCookie(cookie) 時,我們都會將字符串“happy”附加到 cookie 名稱:
HappyCookieFilter implements Filter {
HappyCookieResponseWrapper happyCookieResponseWrapper;
...
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
chain.doFilter(req, happyCookieResponseWrapper.wrap(res));
}
...
}
“測試
doFilter
方法有什么好處?”
沒有任何!
引用問題“是否應該為 getter 和 setter 編寫單元測試? ”的答案:
單元測試用於測試代碼的行為,...
在那個Filter
代碼中確實沒有要測試的行為。 要測試的行為在HappyCookieResponseWrapper
類中,您已經在測試它。 重復那個測試只會浪費時間。
“我想要 100% 的分支機構覆蓋率”
引用上面相同答案的不同部分:
@Will 說你應該瞄准 100% 的代碼覆蓋率,但在我看來,這是一種危險的分心。 您可以編寫具有 100% 覆蓋率的單元測試,但絕對不進行任何測試。
如果doFilter()
方法具有“有趣”的邏輯,例如特殊過濾或路由規則,則測試它們應該是測試此 void 方法的目的。 一般來說,如果 void 方法具有創建副作用的邏輯(除了在您的情況下僅調用chain.doFilter()
),那么測試所述 void 方法的目的將是測試該邏輯。 另一方面,這個邏輯可以也應該存在於一個非空的方法中(可能在另一個類中),它可以自己測試。
擁有 100% 的覆蓋率(行或分支)並不是什么目標(特別是如果您不確保代碼不僅被覆蓋而且還被斷言)。
它是一個完全有效的單元測試類和方法。
在chain.doFilter
測試( happyCookieResponseWrapper.wrap(response)
的預期行為是否作為請求傳遞。沒有技術happyCookieResponseWrapper.wrap(response)
。也許在請求中設置了一個 cookie。happyCookieResponseWrapper 的業務邏輯和功能不需要重復。有可能是基本重疊(設置了 cookie),但這發生在兩個不同的級別。
順便說一句,看到請求的響應包裝器讓我有點驚訝,但是當它編譯時就可以了。
這是一個非常狹窄/瑣碎的檢查。 但是假設此代碼在未來的某個時間被重新設計以使用其他包裝類,這不符合正確的行為。 然后將快速找到回歸錯誤,而不是從模糊描述的錯誤中聽到並處理票證。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.