簡體   English   中英

單元測試像 doFilter 這樣的 void 方法的好處或目的是什么?

[英]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));
}

...
}
  1. 假設 HappyCookieResponseWrapper 已經過單元測試,測試 doFilter 方法有什么好處?
  2. 我將如何測試 HappyCookieFilter.doFilter 以及我應該斷言什么?

“測試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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM