[英]Mockito in order verify with any matchers
我在測試servlet過濾器時遇到一些問題。 此Servlet篩選器的目的是在執行filterChain之后在響應時填充一些http標頭。 因此,我要測試的是,直到調用嘲笑FilterChain.doFilter之后,才會對我的mockHttpServletResponse進行setHeader調用。
我正在使用mockito:mockito-core: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愚蠢的看起來像這樣
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");
}
}
使用any(String.class)導致該測試失敗,因為在提供的Filter實現中,隨后有兩個對response.setHeader的調用。 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));
}
或者,測試應該顯式地測試設置的特定標頭,這是我要走的路徑,因為對於閱讀該測試的人來說,它不太明顯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.