2014-10-27 17 views
5

W mojej aplikacji typu jersey-2 używam bardzo prostego ContainerRequestFilter, który sprawdzi podstawowe uwierzytelnienie (prawdopodobnie wymyślone na nowo koło, ale weź ze mną). Filtr idzie mniej więcej takJak przetestować filtry żądania 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()); 
    } 
} 

Teraz chciałbym napisać test na to, szydząc obiekt 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)); 

} 

Ten test nie powiedzie się na wezwanie eq(r), nawet jeśli patrząc na ciąg znaków obiektów Response są one takie same. Masz pojęcie, co jest nie tak?

Odpowiedz

0

Nie sądzę, że potrzebujesz metody eq(). Powinieneś zweryfikować ten kontekst. abortWith (r) został wywołany. Być może czegoś mi brakuje, ponieważ nie zawarłeś tego, co eq (r).

+0

'eq()' pochodzi z Mockito. Pewnie mógłbym się obejść bez niego, coś w stylu 'verify (context) .abortWith (any())', ale wtedy test przejdzie na wszystkie błędy zamiast po prostu 'UNAUTHORIZED'. Nie tego chcę/tego, co testuję. – agnul

+0

Chodzi mi o to, że powinieneś bezpośrednio umieścić obiekt w odpowiedniej metodzie? Ta metoda nie bierze Matchera, o ile wiem. –