ContainerRequestFilter上的junit测试-验证WebApplicationException';s实体

ContainerRequestFilter上的junit测试-验证WebApplicationException';s实体,junit,jersey,Junit,Jersey,我基于jersey的ContainerRequestFilter构建了一个小身份验证过滤器 当请求未经授权时,这会引发一些WebApplicationException异常,我想对此进行测试 我已经有了这个,以检查在调用filter方法且请求未经授权时是否引发异常: @Category(CommitTest.class) public class BasicAuthenticationFilterTest { @Rule public ExpectedException thr

我基于jersey的ContainerRequestFilter构建了一个小身份验证过滤器

当请求未经授权时,这会引发一些WebApplicationException异常,我想对此进行测试

我已经有了这个,以检查在调用filter方法且请求未经授权时是否引发异常:

@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自己处理的东西)-我想验证这个实体,而不仅仅是异常类型+消息。好的,谢谢你的澄清,我更新了我的答案,以说明我是如何在我的项目中做到这一点的。不过,我通常也会将此作为集成测试,并在预集成测试阶段启动服务器,因此我实际上没有将其作为单元测试运行。谢谢,我今天将尝试此方法,看看它是否有效:)如果不行,那么我只需在单元测试中验证异常类型和消息。效果非常好,我根本没想到这个方法。谢谢你的回答。