对ContainerRequestFilter进行junit测试 - 验证WebApplicationException的实体

时间:2014-04-02 07:35:15

标签: junit jersey

我已经基于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的内存类型“服务器”,并向它发出实际请求(然后验证响应?)

1 个答案:

答案 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());
        }
    }
}