2012-12-14 4 views
1

서블릿 필터를 테스트하는 데 문제가 있습니다. 이 서블릿 필터의 목적은 filterChain이 실행 된 후 응답시 일부 http 헤더를 채우는 것입니다. 그래서 내가 테스트하려고하는 것은 mockHttpServletResponse에 대한 setHeader 호출이 mockFilterChain.doFilter가 호출 될 때까지 발생하지 않는다는 것입니다. mockito 코어 : 나는 mockito을 사용하고Mockito 순서로 어떤 matchers와 확인

은 1.8.5가

그래서, 여기에 샘플 코드

@Test 
public void filterHeaderInjectionHappensLast() throws Exception { 
    javax.servlet.Filter myFilter = new HeaderInjectionFilter(); 

    mockRequest = mock(javax.servlet.http.HttpServletRequest.class); 
    mockResponse = mock(javax.servlet.http.HttpServletResponse.class); 
    mockFilterChain = mock(javax.servlet.FilterChain.class); 

    myFilter.doFilter(mockRequest, mockResponse, mockFilterChain); 

    InOrder inOrder = inOrder(mockFilterChain, mockResponse); 
    inOrder.verify(mockFilterChain).doFilter(mockRequest,mockResponse); 
    inOrder.verify(mockResponse).setHeader(any(String.class),any(String.class));  
} 

실패 할 테스트 인 임의의 문자열 인수를 전달 setHeader의 확인에 않습니다. 코드에서 사용 된 특정 인수를 수락하도록 setHeader 확인 호출을 변경하면 테스트가 성공적으로 통과합니다. 이렇게 주문을 확인할 때 와일드 카드 매처를 사용할 수 없습니까?

HeaderInjectionFilter는 제공된 필터 구현, response.setHeader 두 후속 호출에 어떤 (String.class) 때문에를 사용하여이

public class HeaderInjectionFilter implements Filter { 
    @Override 
    public void destroy() {} 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException {} 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { 
     filterChain.doFilter(request, response); //Always doFilter before we add header to response 

     HttpServletResponse httpServletResponse = (HttpServletResponse) response; 
     httpServletResponse.setHeader(CACHE_CONTROL, "no-cache"); 
     httpServletResponse.setHeader(PRAGMA, "no-cache"); 
    } 
} 
+0

시뮬레이션을 시도했지만 시도 할 수 없습니다. 몇 가지 세부 정보 (Mockito 버전?) 및 아마도 복사/붙여 넣기를 시도해 볼 수있는 코드가 있습니까? – bowmore

+0

사이드 노트 : ['anyString()'] (http://mockito.googlecode.com/svn/branches/1.6/javadoc/org/mockito/Matchers.html#anyString())을 고려하십시오. –

+0

객체'mockFilterChain'과'mockResponse'와 그 api 메소드 서명이 무엇인지에 대해 좀 더 자세히 설명해 주시겠습니까? mockito matcher'any (Interface.class)'가 어떤 객체가 어떤 인터페이스 나 클래스의 인스턴스인지를 확인하지 않는다는 것을 알고 있습니까? (anyString(), anyBoolean(), any (MyClass.class) 등)이 matcher는 _any_ argument를 받아들이며, 클래스/인터페이스 참조는 컴파일러를 만족시키기 위해서만 필요하다. – benjamin

답변

5

이 테스트는 실패한 것처럼 보이는을 무식하게. inOrder.verify는 상호 작용이 순서대로 한 번 발생하는지 확인합니다. 그래서 기술적으로 테스트가 명시 적으로 특정 헤더를 테스트해야합니다 테스트는 테스트를 읽는 사람이 덜 모호한 때문에 내가 아래로 갈 것 경로 인 설정,

@Test 
public void filterHeaderInjectionHappensLast() throws Exception { 
    javax.servlet.Filter myFilter = new HeaderInjectionFilter(); 

    mockRequest = mock(javax.servlet.http.HttpServletRequest.class); 
    mockResponse = mock(javax.servlet.http.HttpServletResponse.class); 
    mockFilterChain = mock(javax.servlet.FilterChain.class); 

    myFilter.doFilter(mockRequest, mockResponse, mockFilterChain); 

    InOrder inOrder = inOrder(mockFilterChain, mockResponse); 
    inOrder.verify(mockFilterChain).doFilter(mockRequest,mockResponse); 
    inOrder.verify(mockResponse, times(2)).setHeader(any(String.class),any(String.class));  
} 

에 변경 또는 수 있습니다.

관련 문제