2017-02-08 17 views
0

Я пытаюсь проверить этот фильтр:Модульное тестирование Jee фильтр

public class HttpMethodOverrideHeaderFilter extends OncePerRequestFilter { 
    private static final String X_HTTP_METHOD_OVERRIDE_HEADER = "X-HTTP-Method-Override"; 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
      throws ServletException, IOException { 

     if (isMethodOverriden(request)) { 
      HttpServletRequest wrapper = new HttpMethodRequestWrapper(request, request.getHeader(X_HTTP_METHOD_OVERRIDE_HEADER).toUpperCase(Locale.ENGLISH)); 
      filterChain.doFilter(wrapper, response); 
     } 
     else { 
      filterChain.doFilter(request, response); 
     } 

    } 

    private boolean isMethodOverriden(HttpServletRequest request) { 
     String methodOverride = request.getHeader(X_HTTP_METHOD_OVERRIDE_HEADER); 
     return RequestMethod.POST.name().equalsIgnoreCase(request.getMethod()) && 
       (RequestMethod.PUT.name().equalsIgnoreCase(methodOverride) || RequestMethod.DELETE.name().equalsIgnoreCase(methodOverride)); 
    } 

    protected static class HttpMethodRequestWrapper extends HttpServletRequestWrapper { 
     private final String method; 

     public HttpMethodRequestWrapper(HttpServletRequest request, String method) { 
      super(request); 
      this.method = method; 
     } 

     @Override 
     public String getMethod() { 
      return this.method; 
     } 
    } 

} 

И это тестовый модуль:

@RunWith(MockitoJUnitRunner.class) 
public class HttpMethodOverrideHeaderFilterTest { 

    private static final String X_HTTP_METHOD_OVERRIDE_HEADER = "X-HTTP-Method-Override"; 

    private HttpMethodOverrideHeaderFilter httpMethodOverrideHeaderFilter; 

    @Mock 
    private HttpServletRequest httpServletRequest; 

    @Mock 
    private HttpServletResponse httpServletResponse; 

    @Mock 
    private FilterChain filterChain; 

    @Before 
    public void setUp() { 
     httpMethodOverrideHeaderFilter = new HttpMethodOverrideHeaderFilter(); 
    } 

    @Test 
    public void testDoFilterInternalWithPUTMethodAsOverrideHeader() throws Exception { 
     when(httpServletRequest.getHeader(X_HTTP_METHOD_OVERRIDE_HEADER)).thenReturn("PUT"); 
     when(httpServletRequest.getMethod()).thenReturn("POST"); 

     HttpServletRequest wrapper = new HttpMethodOverrideHeaderFilter.HttpMethodRequestWrapper(httpServletRequest, "PUT"); 

     httpMethodOverrideHeaderFilter.doFilterInternal(httpServletRequest, httpServletResponse, filterChain); 
     verify(filterChain).doFilter(wrapper, httpServletResponse); 
    } 

} 

тест не проходит, как обертка не тот же экземпляр. В основном то, что мне нужно знать, это если в оболочке был установлен метод PUT. Есть идеи?

ответ

0

Я нашел способ сделать это:

@Test 
public void testDoFilterInternalWithPUTMethodAsOverrideHeader() throws Exception { 
    when(httpServletRequest.getHeader(X_HTTP_METHOD_OVERRIDE_HEADER)).thenReturn("PUT"); 
    when(httpServletRequest.getMethod()).thenReturn("POST"); 

    httpMethodOverrideHeaderFilter.doFilterInternal(httpServletRequest, httpServletResponse, filterChain); 

    ArgumentCaptor<ServletRequest> requestCaptor = ArgumentCaptor.forClass(ServletRequest.class); 
    ArgumentCaptor<ServletResponse> responseCaptor = ArgumentCaptor.forClass(ServletResponse.class); 
    verify(filterChain).doFilter(requestCaptor.capture(), responseCaptor.capture()); 

    HttpMethodOverrideHeaderFilter.HttpMethodRequestWrapper wrapper = (HttpMethodOverrideHeaderFilter.HttpMethodRequestWrapper) requestCaptor.getValue(); 
    assertEquals(wrapper.getMethod(), "PUT"); 
} 

если кто-нибудь знает какой-либо лучший способ, дайте мне знать !!!

 Смежные вопросы

  • Нет связанных вопросов^_^