球衣过滤器的单元测试-spring
Unit test for filter in jersey-spring
我在 web.xml 中为我的 Web 服务添加了一个健康 link 作为
<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 但什么也得不到。
这是在球衣测试框架中完成的
你没有使用正确的方法,servlet 过滤器并不意味着用于此目的,它用于执行过滤任务,在这里当你打破过滤器链时(你不调用 chain.doFilter(request, response)
),您阻止了请求,导致出现 404
错误。
因为您显然使用了 Jersey,您应该创建一个 rest 组件并使用 Jersey Test Framework.
对其进行测试
您的其余组件将 return 状态作为 JSON 对象,只要路径 /health
被请求:
@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));
}
}
我在 web.xml 中为我的 Web 服务添加了一个健康 link 作为
<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 但什么也得不到。
这是在球衣测试框架中完成的
你没有使用正确的方法,servlet 过滤器并不意味着用于此目的,它用于执行过滤任务,在这里当你打破过滤器链时(你不调用 chain.doFilter(request, response)
),您阻止了请求,导致出现 404
错误。
因为您显然使用了 Jersey,您应该创建一个 rest 组件并使用 Jersey Test Framework.
对其进行测试您的其余组件将 return 状态作为 JSON 对象,只要路径 /health
被请求:
@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));
}
}