2

我在 web.xml 中为我的网络服务添加了一个健康链接

<filter>
    <filter-name>healthChecker</filter-name>
    <filter-class>test.HealthChecker</filter-class>
</filter>

<filter-mapping>
    <filter-name>healthChecker</filter-name>
    <url-pattern>/health</url-pattern>
</filter-mapping>
<filter>
    <filter-name>basicAuthenticationFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <async-supported>true</async-supported><!-- filter supports asynchronous processing -->
</filter>
<filter-mapping>
    <filter-name>basicAuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

现在我想对这个健康检查进行单元测试

@Test
public void testHealthCheck() {
    ClientHttpRequestFactory originalRequestFactory = restTemplate.getRequestFactory();
    try {
        WebTarget target = target().path("/health");;

        final Response mockResponse = target.request().get();

        Assert.assertNotNull("Response must not be null", mockResponse.getEntity());
    } finally {
        restTemplate.setRequestFactory(originalRequestFactory);
    }
}

健康检查器的代码是

public class HealthChecker implements Filter {

    @Override
    public void destroy() {
        //do nothing

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain chain) throws IOException, ServletException {
        response.setContentType("text/json");
        String json ="{\"status\":\"UP\"}";
        response.getWriter().append(json);

    }

    @Override
    public void init(FilterConfig filter) throws ServletException {
         // do nothing

    }

}

现在,当我执行此单元测试时,我收到 404 错误。如果我看到目标,那么目标中的 url 是http://localhost:9998/health,这是正确的。

我在 chrome 中使用了这个 url,但什么也得不到。

这是在球衣测试框架中完成的

4

1 回答 1

1

您没有使用正确的方法,servlet 过滤器不打算用于此目的,它用于执行过滤任务,并且当您中断过滤器链(您不调用chain.doFilter(request, response))时,您会阻止请求,例如你得到一个404错误。

由于您显然使用Jersey,您应该创建一个 rest 组件并使用Jersey 测试框架对其进行测试。

/health您的其余组件将在请求路径时将状态作为 JSON 对象返回:

@Path("/health")
public class HealthChecker {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response check() {
        return Response.status(Response.Status.OK)
            .entity("{\"status\":\"UP\"}")
            .build();
    }
}

然后我们测试我们是否真的得到了我们期望的结果:

public class HealthCheckerTest extends JerseyTest {

    @Override
    protected Application configure() {
        return new ResourceConfig(HealthChecker.class);
    }

    @Test
    public void testCreateGroup() {
        Response response = target("/health").request()
            .accept(MediaType.APPLICATION_JSON)
            .get();
        Assert.assertEquals("{\"status\":\"UP\"}", response.readEntity(String.class));
    }
}
于 2017-01-25T11:12:59.407 回答