亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

單元測試 doFilter 的相關性 ID

單元測試 doFilter 的相關性 ID

慕田峪7331174 2021-11-03 14:20:12
我正在使用 dropwizard 構建應用程序。我做了一個過濾器來攔截和記錄調用服務的相關 ID。如果傳入請求的標頭中沒有標頭“Correlation-Id”,我們將在響應中附加一個標頭。以下是過濾器:public class CorrelationIdServletFilter implements Filter {private static final Logger LOGGER =  LoggerFactory.getLogger(CorrelationIdServletFilter.class); private static final String CORRELATION_ID_HEADER_NAME = "Correlation-ID"; private static final String CORRELATION_ID_MDC_KEY = " "; private static final InheritableThreadLocal<String> correlationId =  new InheritableThreadLocal<>();  public static String getCorrelationId() {return correlationId.get(); } @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  throws IOException, ServletException {try {  HttpServletRequest req = (HttpServletRequest) request;  HttpServletResponse res = (HttpServletResponse) response;  String correlationIdHeaderValue = req.getHeader(CORRELATION_ID_HEADER_NAME);  LOGGER.debug      (      "HTTP Header("          + CORRELATION_ID_HEADER_NAME          + ") = ["          + correlationIdHeaderValue          + "] will generate a new correlationId if incoming is NULL");  String correlationIdRaw;  if (!StringUtils.isEmpty(correlationIdHeaderValue)) {    correlationIdRaw = correlationIdHeaderValue;  } else {    correlationIdRaw = UUID.randomUUID().toString();  }  LOGGER.debug("Request: (" + req.getRequestURI() + ") is marked as :" + correlationIdRaw);  correlationId.set(correlationIdRaw);  MDC.put(CORRELATION_ID_MDC_KEY, getCorrelationId());  res.addHeader(CORRELATION_ID_HEADER_NAME, correlationIdRaw);  LOGGER.debug(      "Response holds correlationId : ("          + res.getHeader("Correlation-ID")          + ") in its header ");  chain.doFilter(req, res);} finally {  correlationId.remove();  MDC.remove(CORRELATION_ID_MDC_KEY);}}  @Override  public void destroy() {}}我需要編寫單元測試來涵蓋兩種情況:發送請求時沒有關聯 ID。檢查在服務器端生成的 id。當發送帶有相關 ID 的響應時。檢查它是否與響應一起發回。誰能指出我如何做到這一點?
查看完整描述

1 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

您編寫的測試的一些主要問題:

  1. 被測類永遠不會被嘲笑(可能有一些例外),因為您想對被測類的各種方法進行單元測試的實際調用。

  2. 我們應該始終為被測類的不同方法編寫單獨的單元測試。在這里,我可以看到您還調用了initdestroy方法,而當您要測試該doFilter方法時不需要這些方法。

  3. 當我們創建任何模擬對象時,我們使用期望來定義我們期望對模擬對象進行的調用,并在需要時讓它們返回一些存根值。

現在,我已經嘗試編寫正確的測試來斷言您要測試的兩種情況:

@Test

public void testResponse_for_RequestWithoutCcid() throws IOException, ServletException {


HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);

HttpServletResponse httpServletResponse = mock(HttpServletResponse.class);

FilterChain filterChain = mock(FilterChain.class);

CorrelationIdServletFilter correlationIdServletFilter = new CorrelationIdServletFilter();


expect(httpServletRequest.getHeader(CORRELATION_ID_HEADER_NAME)).andReturn(""); // Empty correlation id in the request


Capture capturedCorrelationIdRaw = newCapture();


httpServletResponse.addHeader(CORRELATION_ID_HEADER_NAME, capture(capturedCorrelationIdRaw));

expectLastCall(); // used for void methods in EasyMock framework


filterChain.doFilter(httpServletRequest, httpServletResponse);

expectLastCall();


CorrelationIdServletFilter.doFilter(httpServletRequest, httpServletResponse,

    filterChain);



assertNotEmpty(capturedCorrelationIdRaw.getValue());



verify(httpServletRequest, times(1))

    .getHeader(CORRELATION_ID_HEADER_NAME);

verify(httpServletResponse, times(1))

    .addHeader(CORRELATION_ID_HEADER_NAME, anyString);


}

該測試需要根據所使用的實際測試框架進行更新,但我已盡力讓您了解測試應該是什么樣子。


查看完整回答
反對 回復 2021-11-03
  • 1 回答
  • 0 關注
  • 258 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號