2014-10-27 72 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