Java ExceptionMapper在运行junit测试用例时不调用响应。但在通过客户端/邮递员运行时正在调用
我有一个测试用例,在这个测试用例中,我抛出了一些基本验证的异常。但是ExceptionMapper没有被调用。但是,如果我从邮递员那里跑过去,去投递服务的话,效果会很好。 对于ExceptionMapper,Junit测试是否必须以不同的方式运行 测试用例:Java ExceptionMapper在运行junit测试用例时不调用响应。但在通过客户端/邮递员运行时正在调用,java,jersey,jax-rs,junit4,jersey-2.0,Java,Jersey,Jax Rs,Junit4,Jersey 2.0,我有一个测试用例,在这个测试用例中,我抛出了一些基本验证的异常。但是ExceptionMapper没有被调用。但是,如果我从邮递员那里跑过去,去投递服务的话,效果会很好。 对于ExceptionMapper,Junit测试是否必须以不同的方式运行 测试用例: @Test public void itShouldHavePersonNumber() { RestAuthController controller = new RestAuthController(); Respons
@Test
public void itShouldHavePersonNumber() {
RestAuthController controller = new RestAuthController();
Response response = controller.insertGuid(null, "m012");
assertThatExceptionOfType(ValidationException.class).isThrownBy(() -> {controller.insertGuid(null, "m012");});
assertThat(response.getStatus()).isEqualTo(Status.BAD_REQUEST.getStatusCode());
}
@Provider
public class ValidationMapper implements ExceptionMapper<ValidationException> {
@Override
public Response toResponse(ValidationException ex) {
return Response.status(Response.Status.BAD_REQUEST).entity(ex.getMessage()).type(MediaType.TEXT_PLAIN).build();
}
}
控制器:
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response insertGuid(@QueryParam("personNumber") Integer personNumber, @QueryParam("guId") String guId ) throws ValidationException {
if(guId == null || guId.isEmpty()) {
throw new ValidationException("guId is Required");
}
}
public class ValidationException extends Exception {
/**
*
*/
private static final long serialVersionUID = 1L;
public ValidationException() {
super();
}
public ValidationException(String message, Throwable cause) {
super(message, cause);
}
public ValidationException(String message) {
super(message);
}
}
异常映射程序:
@Test
public void itShouldHavePersonNumber() {
RestAuthController controller = new RestAuthController();
Response response = controller.insertGuid(null, "m012");
assertThatExceptionOfType(ValidationException.class).isThrownBy(() -> {controller.insertGuid(null, "m012");});
assertThat(response.getStatus()).isEqualTo(Status.BAD_REQUEST.getStatusCode());
}
@Provider
public class ValidationMapper implements ExceptionMapper<ValidationException> {
@Override
public Response toResponse(ValidationException ex) {
return Response.status(Response.Status.BAD_REQUEST).entity(ex.getMessage()).type(MediaType.TEXT_PLAIN).build();
}
}
为什么您认为应该调用异常映射程序?这不是一个集成测试。您所做的只是实例化该类,然后调用一个方法。Java中没有什么神奇的东西可以让异常映射器被调用。如果希望调用映射程序,则需要在Jersey应用程序运行(并注册映射程序)的情况下运行集成测试 使用Jersey运行集成测试的一种方法是使用它的。下面是一个例子
public class ValidationExceptionTest extends JerseyTest {
public static class ValidationException extends RuntimeException {}
public static class ValidationExceptionMapper implements ExceptionMapper<ValidationException> {
@Override
public Response toResponse(ValidationException e) {
return Response.status(400).entity("boo boo").build();
}
}
@Path("echo-name")
public static class EchoNameResource {
@GET
public String echoName(@QueryParam("name") String name) {
if (name == null || name.isEmpty()) {
throw new ValidationException();
}
return name;
}
}
@Override
public ResourceConfig configure() {
return new ResourceConfig()
.register(EchoNameResource.class)
.register(ValidationExceptionMapper.class);
}
@Test
public void testResponseOkWithQueryParam() {
final Response response = target("echo-name")
.queryParam("name", "peeskillet")
.request()
.get();
assertThat(response.getStatus()).isEqualTo(200);
assertThat(response.readEntity(String.class)).isEqualTo("peeskillet");
}
@Test
public void testResponseBadRequestWithNoQueryParam() {
final Response response = target("echo-name")
.request()
.get();
assertThat(response.getStatus()).isEqualTo(400);
}
}
public类ValidationExceptionTest扩展了JerseyTest{
公共静态类ValidationException扩展RuntimeException{}
公共静态类ValidationExceptionMapper实现ExceptionMapper{
@凌驾
公众响应(验证异常e){
返回Response.status(400).entity(“boo boo”).build();
}
}
@路径(“回显名称”)
公共静态类EchoNameResource{
@得到
公共字符串echoName(@QueryParam(“name”)字符串名){
if(name==null | | name.isEmpty()){
抛出新的ValidationException();
}
返回名称;
}
}
@凌驾
公共资源配置(){
返回新的ResourceConfig()
.register(EchoNameResource.class)
.register(ValidationExceptionMapper.class);
}
@试验
public void testResponseOkWithQueryParam(){
最终响应=目标(“回音名称”)
.queryParam(“名称”、“peeskillet”)
.request()
.get();
断言(response.getStatus()).isEqualTo(200);
assertThat(response.readEntity(String.class)).isEqualTo(“peeskillet”);
}
@试验
public void testResponseBadRequestWithNoQueryParam(){
最终响应=目标(“回音名称”)
.request()
.get();
断言(response.getStatus()).isEqualTo(400);
}
}
是否尝试使用@javax.ws.rs.ext.Provider注释ValidationExceptionMapper类?