我已经基于jersey的ContainerRequestFilter构建了一个小的身份验证过滤器。
当请求未经授权时,会抛出一些WebAplicationExceptions,我想测试一下。
我已经有了这个,检查在调用过滤器方法并且请求未经授权时引发异常:
@Category(CommitTest.class)
public class BasicAuthenticationFilterTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
@Test
public void someInvalidAuthTest() throws IOException {
//...setup auth filter, and mock objects
//Expect an WebApplicationException
thrown.expect(WebApplicationException.class);
authenticationFilter.filter(mockRequestContext);
}
}
我可以做得很好,我的测试运行正常。但我希望能够验证异常的响应。
修改的
为了澄清,我通常抛出这样的例外:
ApiError error = new ApiError(1, "UNAUTHORIZED", "No or empty authorization header");
throw new WebApplicationException(
error.getMessage(),
Response.status(Response.Status.UNAUTHORIZED).entity(error).build());
我想验证异常中抛出的响应和实体。现在我知道这甚至不可能。但我不得不要求确认。
或者我应该以其他方式进行测试,并实际设置一个使用我的auth-filter的内存类型“服务器”,并向它发出实际请求(然后验证响应?)
答案 0 :(得分:3)
您可以更新规则以检查异常消息,但是要获取响应实体,可能更容易尝试/捕获这样:
@Category(CommitTest.class)
public class BasicAuthenticationFilterTest {
@Test
public void someInvalidAuthTest() throws IOException {
//...setup auth filter, and mock objects
try {
authenticationFilter.filter(mockRequestContext);
fail("expect a WebApplicationException");
}
catch (WebApplicationException e) {
Response r = e.getResponse();
// validate status code
assertEquals(Response.Status.UNAUTHORIZED, r.getStatusInfo());
// validate entity
ApiError error = r.readEntity(ApiError.class);
assertEquals("No or empty authorization header", error.getMessage());
}
}
}