簡體   English   中英

Mockito以便與任何匹配者進行驗證

[英]Mockito in order verify with any matchers

我在測試servlet過濾器時遇到一些問題。 此Servlet篩選器的目的是在執行filterChain之后在響應時填充一些http標頭。 因此,我要測試的是,直到調用嘲笑FilterChain.doFilter之后,才會對我的mockHttpServletResponse進行setHeader調用。

我正在使用mockito:mockito-core:1.8.5

因此,這是一個示例代碼片段

@Test
public void filterHeaderInjectionHappensLast() throws Exception {
    javax.servlet.Filter myFilter = new HeaderInjectionFilter();

    mockRequest = mock(javax.servlet.http.HttpServletRequest.class);
    mockResponse = mock(javax.servlet.http.HttpServletResponse.class);
    mockFilterChain = mock(javax.servlet.FilterChain.class);

    myFilter.doFilter(mockRequest, mockResponse, mockFilterChain);

    InOrder inOrder = inOrder(mockFilterChain, mockResponse);
    inOrder.verify(mockFilterChain).doFilter(mockRequest,mockResponse);
    inOrder.verify(mockResponse).setHeader(any(String.class),any(String.class));    
}

該測試將無法驗證setHeader是否通過任何字符串參數。 如果我將setHeader驗證調用更改為接受代碼中使用的特定參數,則測試將成功通過。 驗證這樣的訂單時,可以不使用通配符匹配器嗎?

HeaderInjectionFilter愚蠢的看起來像這樣

public class HeaderInjectionFilter implements Filter {
    @Override
    public void destroy() {}

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(request, response); //Always doFilter before we add header to response

        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setHeader(CACHE_CONTROL, "no-cache");
        httpServletResponse.setHeader(PRAGMA, "no-cache");
    }
}

使用any(String.class)導致該測試失敗,因為在提供的Filter實現中,隨后有兩個對response.setHeader的調用。 inOrder.verify驗證交互是否按順序進行了一次。 因此從技術上講,測試可以更改為

@Test
public void filterHeaderInjectionHappensLast() throws Exception {
    javax.servlet.Filter myFilter = new HeaderInjectionFilter();

    mockRequest = mock(javax.servlet.http.HttpServletRequest.class);
    mockResponse = mock(javax.servlet.http.HttpServletResponse.class);
    mockFilterChain = mock(javax.servlet.FilterChain.class);

    myFilter.doFilter(mockRequest, mockResponse, mockFilterChain);

    InOrder inOrder = inOrder(mockFilterChain, mockResponse);
    inOrder.verify(mockFilterChain).doFilter(mockRequest,mockResponse);
    inOrder.verify(mockResponse, times(2)).setHeader(any(String.class),any(String.class));    
}

或者,測試應該顯式地測試設置的特定標頭,這是我要走的路徑,因為對於閱讀該測試的人來說,它不太明顯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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