package io.dropwizard.testing.app; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.guava.GuavaModule; import com.google.common.base.Strings; import io.dropwizard.jackson.Jackson; import io.dropwizard.jersey.validation.JerseyViolationException; import io.dropwizard.testing.junit.ResourceTestRule; import org.glassfish.jersey.spi.ExtendedExceptionMapper; import org.junit.ClassRule; import org.junit.Test; import javax.ws.rs.client.Entity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; public class PersonResourceExceptionMapperTest { private static final PeopleStore PEOPLE_STORE = mock(PeopleStore.class); private static final ObjectMapper OBJECT_MAPPER = Jackson.newObjectMapper() .registerModule(new GuavaModule()); @ClassRule public static final ResourceTestRule RESOURCES = ResourceTestRule.builder() .addResource(new PersonResource(PEOPLE_STORE)) .setRegisterDefaultExceptionMappers(false) .addProvider(new MyJerseyExceptionMapper()) .addProvider(new GenericExceptionMapper()) .setMapper(OBJECT_MAPPER) .build(); @Test public void testDefaultConstraintViolation() { assertThat(RESOURCES.target("/person/blah/index") .queryParam("ind", -1).request() .get().readEntity(String.class)) .isEqualTo("Invalid data"); } @Test public void testDefaultJsonProcessingMapper() { assertThat(RESOURCES.target("/person/blah/runtime-exception") .request() .post(Entity.json("{ \"he: \"ho\"}")) .readEntity(String.class)) .startsWith("Something went wrong: Unexpected character"); } @Test public void testDefaultExceptionMapper() { assertThat(RESOURCES.target("/person/blah/runtime-exception") .request() .post(Entity.json("{}")) .readEntity(String.class)) .isEqualTo("Something went wrong: I'm an exception!"); } @Test public void testDefaultEofExceptionMapper() { assertThat(RESOURCES.target("/person/blah/eof-exception") .request() .get().readEntity(String.class)) .isEqualTo("Something went wrong: I'm an eof exception!"); } private static class MyJerseyExceptionMapper implements ExceptionMapper<JerseyViolationException> { @Override public Response toResponse(JerseyViolationException exception) { return Response.status(Response.Status.BAD_REQUEST) .type(MediaType.TEXT_PLAIN) .entity("Invalid data") .build(); } } private static class GenericExceptionMapper implements ExtendedExceptionMapper<Throwable> { @Override public boolean isMappable(Throwable throwable) { return !(throwable instanceof JerseyViolationException); } @Override public Response toResponse(Throwable exception) { return Response.status(Response.Status.BAD_REQUEST) .type(MediaType.TEXT_PLAIN) .entity("Something went wrong: " + Strings.nullToEmpty(exception.getMessage())) .build(); } } }