서블릿 필터를 테스트하는 데 문제가 있습니다. 이 서블릿 필터의 목적은 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");
}
}
시뮬레이션을 시도했지만 시도 할 수 없습니다. 몇 가지 세부 정보 (Mockito 버전?) 및 아마도 복사/붙여 넣기를 시도해 볼 수있는 코드가 있습니까? – bowmore
사이드 노트 : ['anyString()'] (http://mockito.googlecode.com/svn/branches/1.6/javadoc/org/mockito/Matchers.html#anyString())을 고려하십시오. –
객체'mockFilterChain'과'mockResponse'와 그 api 메소드 서명이 무엇인지에 대해 좀 더 자세히 설명해 주시겠습니까? mockito matcher'any (Interface.class)'가 어떤 객체가 어떤 인터페이스 나 클래스의 인스턴스인지를 확인하지 않는다는 것을 알고 있습니까? (anyString(), anyBoolean(), any (MyClass.class) 등)이 matcher는 _any_ argument를 받아들이며, 클래스/인터페이스 참조는 컴파일러를 만족시키기 위해서만 필요하다. – benjamin