如何使用 jUnit 对 Servlet Filter 进行单元测试?ServletRequest、ServletResponse、FilterChain

sam*_*sam 5 java junit mocking junit4 aem

如何用JUnit正确覆盖Filter?

@SlingFilter(order = -700, scope = SlingFilterScope.REQUEST)
public class LoggingFilter implements Filter {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response,
            final FilterChain filterChain) throws IOException, ServletException {

        final SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
        logger.debug("request for {}, with selector {}", slingRequest
                .getRequestPathInfo().getResourcePath(), slingRequest
                .getRequestPathInfo().getSelectorString());

        filterChain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) {}

    @Override
    public void destroy() {}

}
Run Code Online (Sandbox Code Playgroud)

小智 3

调用 doFilter,传递模拟 ServletRequest、ServletResponse 和 FilterChain 作为其参数。

@Test
public void testDoFilter() {
    LoggingFilter filterUnderTest = new LoggingFilter();    
    MockFilterChain mockChain = new MockFilterChain();
    MockServletRequest req = new MockServletRequest("/test.jsp");
    MockServletResponse rsp = new MockServletResponse();

    filterUnderTest.doFilter(req, rsp, mockChain);

    assertEquals("/test.jsp",rsp.getLastRedirect());
}
Run Code Online (Sandbox Code Playgroud)

在实践中,您需要将设置移至一个@Before setUp()方法中,并编写更多@Test方法来覆盖每个可能的执行路径。

JMock您可能会使用类似或 之类的模拟框架Mockito来创建模拟,而不是MockModeService我在这里使用的假设等。

这是一种单元测试方法,而不是集成测试。您仅练习被测试的单元(和测试代码)。