2014-10-27 101 views
5

在我的澤西-2應用程序中,我使用了一個非常簡單的ContainerRequestFilter,它將檢查基本身份驗證(可能重新發明輪子,但請耐心等待)。過濾去有點像這樣如何測試jersey2請求過濾器?

@Override 
public void filter(ContainerRequestContext context) throws IOException { 
    String authHeader = context.getHeaderString(HttpHeaders.AUTHORIZATION); 
    if (StringUtils.isBlank(authHeader)) { 
     log.info("Auth header is missing."); 
     context.abortWith(Response.status(Response.Status.UNAUTHORIZED) 
       .type(MediaType.APPLICATION_JSON) 
       .entity(ErrorResponse.authenticationRequired()) 
       .build()); 
    } 
} 

現在,我想編寫一個測試吧,嘲諷ContainerRequestContext對象。

@Test 
public void emptyHeader() throws Exception { 

    when(context.getHeaderString(HttpHeaders.AUTHORIZATION)).thenReturn(null); 

    filter.filter(context); 

    Response r = Response.status(Response.Status.UNAUTHORIZED) 
      .type(MediaType.APPLICATION_JSON) 
      .entity(ErrorResponse.authenticationRequired()) 
      .build(); 

    verify(context).abortWith(eq(r)); 

} 

此測試失敗的eq(r)通話,即使在看Response對象它們是相同的字符串表示。任何想法有什麼不對?

回答

0

我不相信你需要eq()方法。你應該驗證上下文。 (r)被調用。我可能會錯過一些東西,因爲你沒有包括什麼eq(r)。

+0

'eq()'來自Mockito。當然,我可以沒有它,比如'verify(context).abortWith(any())',但是測試會傳遞所有錯誤,而不僅僅是'UNAUTHORIZED'。不是我想要的/我正在測試的。 – agnul 2017-09-15 08:22:15

+0

我的觀點是你應該直接把對象放入方法中嗎?據我所知,該方法不需要匹配器。 – 2017-09-16 19:24:24