1

サーブレット フィルタのテストで問題が発生しています。このサーブレット フィルターの目的は、filterChain が実行された後の応答にいくつかの http ヘッダーを設定することです。したがって、私がテストしようとしているのは、mockFilterChain.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");
    }
}
4

1 に答える 1

5

このテストは any(String.class) を使用して失敗していました。これは、提供された Filter 実装で、response.setHeader への 2 つの連続した呼び出しがあったためです。inOrder.verify は、相互作用が順番に 1 回発生することを検証します。したがって、技術的には、テストを次のように変更できます

@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));    
}

または、テストでは、特定のヘッダーが設定されていることを明示的にテストする必要があります。これは、テストを読んでいる人にとってわかりにくいため、私がたどるパスです。

于 2012-12-17T21:25:35.090 に答える