Java 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

我有一个测试用例,在这个测试用例中,我抛出了一些基本验证的异常。但是ExceptionMapper没有被调用。但是,如果我从邮递员那里跑过去,去投递服务的话,效果会很好。 对于ExceptionMapper,Junit测试是否必须以不同的方式运行

测试用例

@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类?