首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用jUnit对Servlet筛选器进行单元测试?ServletRequest、ServletResponse、FilterChain

如何使用jUnit对Servlet筛选器进行单元测试?ServletRequest、ServletResponse、FilterChain
EN

Stack Overflow用户
提问于 2020-09-02 21:07:50
回答 3查看 1.8K关注 0票数 4

如何正确地用JUnit覆盖过滤器?

代码语言:javascript
运行
复制
@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() {}

}
EN

回答 3

Stack Overflow用户

发布于 2020-09-02 21:20:24

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

代码语言:javascript
运行
复制
@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());
}

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2020-09-02 22:12:48

您可以在使用Junit-5进行测试时使用以下代码

代码语言:javascript
运行
复制
@ExtendWith(MockitoExtension.class)
public class LoggingFilterTest{
    
    @InjectMocks
    private LoggingFilter loggingFilter;
    
    @Mock
    private ServletRequest request
    
    @Mock
    private ServletResponse response
    
    @Mock
    private FilterChain filterChain
    
    @Mock
    private RequestPathInfo requestPathInfo;
    
    @Test
    public void testDoFilter() throws IOException, ServletException{
    
        Mockito.when(request.getResourcePath()).thenReturn(requestPathInfo);
        Mockito.when(requestPathInfo.getResourcePath()).thenReturn("/testPath", "selectorString");
        Mockito.doNothing().when(filterChain).doFilter(Mockito.eq(request), Mockito.eq(response));
        
        loggingFilter.doFilter(request, response, filterChain);
        
        Mockito.verify(filterChain, times(1)).doFilter(Mockito.eq(request), Mockito.eq(response));
    }
}

如果您使用的是junit4,则将@ExtendWith(MockitoExtension.class)更改为@RunWith(MockitoJUnitRunner.class)

票数 3
EN

Stack Overflow用户

发布于 2020-09-13 22:24:48

如果你在Junit5中使用AEM Mock,那么它可能看起来像这样。

代码语言:javascript
运行
复制
@ExtendWith(AemContextExtension.class)
class SimpleFilterTest {

    private static final AemContext context =  new AemContext(ResourceResolverType.RESOURCERESOLVER_MOCK);

    private static final String RESOURCE_PATH = "/content/test";
    private static final String SELECTOR_STRING = "selectors";

    private static SimpleFilter simpleFilter;
    private static FilterChain filterChain;

    @BeforeAll
    static void setup() {
        simpleFilter = context.registerService(SimpleFilter.class, new SimpleFilter());
        filterChain = context.registerService(FilterChain.class, new MockFilterChain());
    }

    @Test
    @DisplayName("GIVEN the request, WHEN is executed, THEN request should be filtered and contain corresponding header")
    void testDoFilter() throws ServletException, IOException {
        context.requestPathInfo().setResourcePath(RESOURCE_PATH);
        context.requestPathInfo().setSelectorString(SELECTOR_STRING);

        simpleFilter.doFilter(context.request(), context.response(), filterChain);

        assertEquals("true", context.response().getHeader("filtered"));
    }

}

模拟

代码语言:javascript
运行
复制
public class MockFilterChain implements FilterChain {

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException {
        // do nothing
    }

}

一些简单的过滤器

代码语言:javascript
运行
复制
@Component(service = Filter.class)
@SlingServletFilter(scope = SlingServletFilterScope.REQUEST)
@ServiceRanking(-700)
public class SimpleFilter implements Filter {

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain filterChain) throws IOException, ServletException {
        final SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
        log.debug("request for {}, with selector {}", slingRequest.getRequestPathInfo().getResourcePath(),
          slingRequest.getRequestPathInfo().getSelectorString());

        final SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;
        slingResponse.setHeader("filtered", "true");
        filterChain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void destroy() {
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63706202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档