MockHttpServletResponseを使用してResponseHeaderFilter内でHttpServletResponseWrapperをテストしようとしています

私は以下のResponseHeaderFilterを単体テストしようとしていますが、このユニットテストが失敗することがわかります:

@Test
public void testDoFilterWithOmmissableInitParameters_ETag()
        throws IOException, ServletException {

   //Add allowableUserAgents initParameters
    MockFilterConfig filterConfig = new MockFilterConfig();
    filterConfig.addInitParameter("allowableUserAgents", "avaya");

   //Add allowableUserAgents initParameters
    filterConfig.addInitParameter(OMIT_KEY, OMIT_VALUE);

   //Set user-agent
    request.addHeader("user-agent", "avaya");
    response.addHeader("ETag", "someEtagHash");

    filter.init(filterConfig);
    filter.doFilter(request, response, chain);

   //THIS ASSERTION FAILS:
    assertThat((String)response.getHeader("ETag"), is(nullValue()));
}

具体的には、私がデバッグモードでこれを実行するとsetHeader()メソッドは呼び出されません:

            chain.doFilter(request,
                                new HttpServletResponseWrapper(response) {
                                    public void setHeader(String name, String value) {
                                        //if (!(name != null && omitHeaders.contains(name.toUpperCase()))) {
                                        if (name != null && omitHeaders.contains(name)) {
                                            super.setHeader(name, value);
                                        }
                                    }
                                });

デバッガは新しいHttpServletResponseWrapper(応答)の行に到達しますが、実際にはsetHeaderメソッドは実行されません。

ここにクラス全体があります:

public class ResponseHeaderFilter implements Filter {

    private static final Logger logger = LoggerFactory.getLogger(ResponseHeaderFilter.class);

    Map additionalHeaders = new HashMap();

    Set omitHeaders = new TreeSet(String.CASE_INSENSITIVE_ORDER);

    Set allowableUserAgents = new TreeSet(String.CASE_INSENSITIVE_ORDER);

    boolean allowFromAllUserAgents = false;

    public void doFilter(final ServletRequest request,
                         final ServletResponse res,
                         final FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;

        String userAgent = ((HttpServletRequest) request).getHeader("user-agent");

        if (allowFromAllUserAgents
            || (userAgent != null && allowableUserAgents.contains(userAgent))
        ) {
            logger.debug("apply ResponseHeader rules for user agent [{}]", userAgent);
            for (Map.Entry entry : additionalHeaders.entrySet()) {
                response.addHeader(entry.getKey(), entry.getValue());
            }

            chain.doFilter(request,
                                    new HttpServletResponseWrapper(response) {
                                        public void setHeader(String name, String value) {
                                            //if (!(name != null && omitHeaders.contains(name.toUpperCase()))) {
                                            if (name != null && omitHeaders.contains(name)) {
                                                super.setHeader(name, value);
                                            }
                                        }
                                    });
        } else {
            logger.debug("User agent [{}] is not an allowable agent for this filter", userAgent);
            chain.doFilter(request, res);
        }
    }

    /**
     * Called once during start-up
     *
     * @param filterConfig for Filter configuration
     */
    public void init(final FilterConfig filterConfig) {

        logger.info("*** ResponseHeaderFilter.init() ***");

       //set the provided HTTP response parameters
        for (Enumeration e = filterConfig.getInitParameterNames(); e.hasMoreElements(); ) {
            String headerName = (String) e.nextElement();
            String headerValue = filterConfig.getInitParameter(headerName);

           //Add the list of allowable user-agents
           //cannot be null: if (headerName != null) {
                if (headerName.equalsIgnoreCase("allowableUserAgents")) {
                   //omit
                    parseToUpperCaseElements(headerValue, allowableUserAgents);
                    logger.debug("allowable user-agent's {}", allowableUserAgents);
                } else if (headerName.equalsIgnoreCase("allowFromAllUserAgents")) {
                    allowFromAllUserAgents = Boolean.parseBoolean(headerValue);
                    logger.debug("allowFromAllUserAgents {}", allowFromAllUserAgents);
                } else if (headerName.equalsIgnoreCase("omit")) {
                    parseToUpperCaseElements(headerValue, omitHeaders);
                    logger.debug("Omit headers {}", omitHeaders);
                } else {
                    additionalHeaders.put(headerName, headerValue);
                    logger.debug("adding header [{}] with value [{}]", headerName, headerValue);
                }
            //}
        }
    }

    protected final void parseToUpperCaseElements(final String str, final Set elementKeys) {
        String[] words = str.split(",");
        for (String s : words) {
            elementKeys.add(s.trim().toUpperCase());
        }
    }

    public void destroy() {
        logger.debug("destroy");
    }
}

このフィルタは実際に動作していて、ETagヘッダを削除しませんが、コードカバレッジにCoberturaを使用しようとしているときは、そのメソッドはテストされていません。

1

1 答え

実際に ResponseHeaderFilter をテストしているコードは、 FilterChain で匿名の HttpServletResponseWrapper のみを追加または登録します。

chain.doFilter(request, new HttpServletResponseWrapper(response) {
    public void setHeader(String name, String value) { ... }
});

また、 FilterChain はコンテナ自体によって実行されます。あなたのテストコードは、 FilterChain リファレンスを渡すだけです。

あなたのテストで FilterChain の実際のタイプはわかりませんが、タグが削除されたことを主張する代わりに( assertThat(String)response.getHeader( "ETag")) (nullValue())); )私は2つの異なるテストであなたのテストを分割します。

    EtagRemoverHttpServletResponseWrapper と呼ばれる完全な型で匿名の HttpServletResponseWrapper を置き換え、 wrapper.setHeaderで実際にそれをアサートする単体テストを行います。 (...)そのヘッダーは省略されています。

    チェーン ETagRemoverHttpServletResponseWrapper タイプの参照が含まれていることを示す ResponseHeaderFilter >

希望が役立ちます。

0
追加された