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

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

Stack Overflow用户
提问于 2012-07-12 20:30:54
回答 3查看 50.5K关注 0票数 39

实现了doFilter()。如何正确地用jUnit覆盖过滤器?

代码语言:javascript
运行
复制
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws java.io.IOException, javax.servlet.ServletException
{
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    String currentURL = request.getRequestURI();

    if (!currentURL.equals("/maintenance.jsp") && modeService.getOnline())
    {
        response.sendRedirect("/maintenance.jsp");
    }
    filterChain.doFilter(servletRequest, servletResponse);
}
EN

回答 3

Stack Overflow用户

发布于 2012-07-12 20:50:15

ServletRequestServletResponseFilterChain都是接口,因此您可以很容易地手动或使用模拟框架为它们创建测试存根。

使模拟对象可配置,以便您可以准备对getRequestURI()的封装响应,并且可以查询ServletResponse以断言sendRedirect已被调用。

注入模拟ModeService。

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

代码语言:javascript
运行
复制
@Test
public void testSomethingAboutDoFilter() {
    MyFilter filterUnderTest = new MyFilter();
    filterUnderTest.setModeService(new MockModeService(ModeService.ONLINE));
    MockFilterChain mockChain = new MockFilterChain();
    MockServletRequest req = new MockServletRequest("/maintenance.jsp");
    MockServletResponse rsp = new MockServletResponse();

    filterUnderTest.doFilter(req, rsp, mockChain);

    assertEquals("/maintenance.jsp",rsp.getLastRedirect());
}

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

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

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

票数 40
EN

Stack Overflow用户

发布于 2014-11-09 15:57:18

您可以使用模拟框架来模拟上面的HttpServletRequestHttpServletResponseFilterChain对象及其行为。根据框架的不同,您可以使用特定的功能来验证在代码执行期间对模拟对象执行的操作是否正确。

例如,当使用Mockito模拟框架时,可以使用以下测试用例对提供的doFilter()方法进行JUnit测试:

代码语言:javascript
运行
复制
@Test
public void testDoFilter() throws IOException, ServletException {
    // create the objects to be mocked
    HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);
    HttpServletResponse httpServletResponse = mock(HttpServletResponse.class);
    FilterChain filterChain = mock(FilterChain.class);
    // mock the getRequestURI() response
    when(httpServletRequest.getRequestURI()).thenReturn("/otherurl.jsp");

    MaintenanceFilter maintenanceFilter = new MaintenanceFilter();
    maintenanceFilter.doFilter(httpServletRequest, httpServletResponse,
            filterChain);

    // verify if a sendRedirect() was performed with the expected value
    verify(httpServletResponse).sendRedirect("/maintenance.jsp");
}
票数 21
EN

Stack Overflow用户

发布于 2017-03-29 16:03:01

如果你使用的是Spring,那么它有自己的mock:

  • org.springframework.mock.web.MockFilterChain
  • org.springframework.mock.web.MockHttpServletRequest
  • org.springframework.mock.web.MockHttpServletResponse

例如,您可以添加标头并设置测试Uri。

所以你的测试可以是这样的:

代码语言:javascript
运行
复制
@RunWith(MockitoJUnitRunner.class)
public class TokenAuthenticationFilterTest {

    private static final String token = "260bce87-6be9-4897-add7-b3b675952538";
    private static final String testUri = "/testUri";

    @Mock
    private SecurityService securityService;

    @InjectMocks
    private TokenAuthenticationFilter tokenAuthenticationFilter = new TokenAuthenticationFilter();

    @Test
    public void testDoFilterInternalPositiveScenarioWhenTokenIsInHeader() throws ServletException, IOException {
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.addHeader(TOKEN, token);
        request.setRequestURI(testUri);
        MockHttpServletResponse response = new MockHttpServletResponse();
        MockFilterChain filterChain = new MockFilterChain();
        when(securityService.doesExistToken(token)).thenReturn(true);
        tokenAuthenticationFilter.doFilterInternal(request, response, filterChain);
        assertThat(response.getStatus()).isEqualTo(HttpStatus.OK.value());
    }
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11451917

复制
相关文章

相似问题

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