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?
'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
Chodzi mi o to, że powinieneś bezpośrednio umieścić obiekt w odpowiedniej metodzie? Ta metoda nie bierze Matchera, o ile wiem. –