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?
'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
Mein Punkt war, dass Sie das Objekt direkt in die Methode setzen sollten, oder? Diese Methode braucht keinen Matcher, soweit ich das beurteilen kann. –