2014-10-27 11 views
5

In meiner Trikot-2-Anwendung verwende ich eine sehr einfache ContainerRequestFilter, die für die Basis-Authentifizierung (wahrscheinlich erfinden Rad neu, aber mit mir) überprüfen. Filter geht etwas wie diesesWie testet man jersey2 Anfrage Filter?

@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()); 
    } 
} 

Nun würde Ich mag einen Test für sie schreiben, verspotten die ContainerRequestContext Objekt.

@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)); 

} 

Dieser Test schlägt fehl am eq(r) Anruf, auch wenn an der String-Repräsentation der Response Objekte suchen sie die gleichen sind. Irgendeine Idee, was ist los?

Antwort

0

Ich glaube nicht, dass Sie die eq() -Methode benötigen. Sie sollten diesen Kontext überprüfen. abortWith (r) wurde aufgerufen. Ich könnte jedoch etwas vermissen, weil Sie nicht eingeschlossen haben, was eq (r) ist.

+0

'eq()' kommt von Mockito. Natürlich könnte ich darauf verzichten, etwas wie 'verify (context) .abortWith (any())', aber dann würde der Test für alle Fehler statt nur 'UNAUTHORIZED' bestehen. Nicht was ich will/was ich teste. – agnul

+0

Mein Punkt war, dass Sie das Objekt direkt in die Methode setzen sollten, oder? Diese Methode braucht keinen Matcher, soweit ich das beurteilen kann. –