Quarkus: How to test ExceptionMapper with Mutiny and RestEasy client

61 Views Asked by At

I have a reactive RestEasy client with a method that returns a Uni:

@Path("/api")
@RegisterRestClient(configKey="data-api")
@RegisterProvider(DataClientExceptionMapper.class)
public interface DataClient{

    @GET
    @Path("/data/{id}")
    Uni<Data> get(@RestPath String id);
}

I have my ExceptionMapper like:

@Provider
public class DataClientExceptionMapper implements ResponseExceptionMapper<MyException> {

@Override
public MyException toThrowable(Response response) {
    if (response.getStatus() >= 400) {
        ErrorMessage error = response.readEntity(ErrorMessage.class);
        logger.warning(() -> String.format("The remote service responded with HTTP %s - code=%s - message=%s", response.getStatus(), error.getCode(), error.getMessage()));
        throw new MyException(error.getCode(), error.getMessage(), response.getStatusInfo().toEnum());
    } else {
        return null;
    }
}

}

And now, I want to test my mapper with (I have wiremock which returns a HTTP 500):

assertThrows(MyException.class, () -> client.get("1").await().indefinitely());

The problem is: There is a ProcessException that is thrown with MyException as the cause

The failed test result is:

org.opentest4j.AssertionFailedError: Unexpected exception type thrown, expected: <exception.MyException> but was: <jakarta.ws.rs.ProcessingException>
    at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151)
    at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:67)
    at org.junit.jupiter.api.AssertThrows.assertThrows(AssertThrows.java:35)
    at org.junit.jupiter.api.Assertions.assertThrows(Assertions.java:3115)
    at ExceptionMapperTest.testServerErrorMapping(ExceptionMapperTest.java:34)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at io.quarkus.test.junit.QuarkusTestExtension.runExtensionMethod(QuarkusTestExtension.java:1013)
    at io.quarkus.test.junit.QuarkusTestExtension.interceptTestMethod(QuarkusTestExtension.java:827)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Caused by: jakarta.ws.rs.ProcessingException: exception.MyException: an unexpected error occurred
    at org.jboss.resteasy.reactive.client.handlers.ClientResponseFilterRestHandler.handle(ClientResponseFilterRestHandler.java:25)
    at org.jboss.resteasy.reactive.client.handlers.ClientResponseFilterRestHandler.handle(ClientResponseFilterRestHandler.java:10)
    at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.invokeHandler(AbstractResteasyReactiveContext.java:231)
    at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
    at io.smallrye.context.impl.wrappers.SlowContextualRunnable.run(SlowContextualRunnable.java:19)
    at org.jboss.resteasy.reactive.client.handlers.ClientSwitchToRequestContextRestHandler$1$1.handle(ClientSwitchToRequestContextRestHandler.java:38)
    at org.jboss.resteasy.reactive.client.handlers.ClientSwitchToRequestContextRestHandler$1$1.handle(ClientSwitchToRequestContextRestHandler.java:35)
    at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:276)
    at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:258)
    at io.vertx.core.impl.ContextInternal.lambda$runOnContext$0(ContextInternal.java:56)
    at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:566)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: exception.MyException: an unexpected error occurred
    at DataClientExceptionMapper .toThrowable(DataClientExceptionMapper.java:22)
    at DataClientExceptionMapper .toThrowable(DataClientExceptionMapper .java:11)
    at io.quarkus.rest.client.reactive.runtime.MicroProfileRestClientResponseFilter.filter(MicroProfileRestClientResponseFilter.java:52)
    at org.jboss.resteasy.reactive.client.handlers.ClientResponseFilterRestHandler.handle(ClientResponseFilterRestHandler.java:21)
    ... 17 more

Any grateful help on this?

0

There are 0 best solutions below