ContainerRequestFilter上的junit测试-验证WebApplicationException';s实体
我基于jersey的ContainerRequestFilter构建了一个小身份验证过滤器 当请求未经授权时,这会引发一些WebApplicationException异常,我想对此进行测试 我已经有了这个,以检查在调用filter方法且请求未经授权时是否引发异常:ContainerRequestFilter上的junit测试-验证WebApplicationException';s实体,junit,jersey,Junit,Jersey,我基于jersey的ContainerRequestFilter构建了一个小身份验证过滤器 当请求未经授权时,这会引发一些WebApplicationException异常,我想对此进行测试 我已经有了这个,以检查在调用filter方法且请求未经授权时是否引发异常: @Category(CommitTest.class) public class BasicAuthenticationFilterTest { @Rule public ExpectedException thr
@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());
@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());
}
}
}
我想验证异常中抛出的响应和实体。现在我知道这甚至是不可能的。但我得问清楚
或者我应该以完全不同的方式进行此测试,并实际设置一个使用我的身份验证筛选器的内存类型“服务器”,并向其发出实际请求(然后验证响应?您可以更新规则以检查异常消息,但要获取响应实体,可能更容易尝试/捕获以下内容:
ApiError error = new ApiError(1, "UNAUTHORIZED", "No or empty authorization header");
throw new WebApplicationException(
error.getMessage(),
Response.status(Response.Status.UNAUTHORIZED).entity(error).build());
@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());
}
}
}
你所说的“异常响应”是什么意思?喜欢例外信息吗?或者HTTP状态码?我通常在抛出异常时创建一个包含实体的响应(响应和实体可能是jersey自己处理的东西)-我想验证这个实体,而不仅仅是异常类型+消息。好的,谢谢你的澄清,我更新了我的答案,以说明我是如何在我的项目中做到这一点的。不过,我通常也会将此作为集成测试,并在预集成测试阶段启动服务器,因此我实际上没有将其作为单元测试运行。谢谢,我今天将尝试此方法,看看它是否有效:)如果不行,那么我只需在单元测试中验证异常类型和消息。效果非常好,我根本没想到这个方法。谢谢你的回答。