如何为 Quarkus 编写测试 - ResponseExceptionMapper 和 ExceptionMapper

问题描述 投票:0回答:2

我正在使用两个异常映射器,responseExceptionMapper 和ExceptionMapper。 现在我需要这些映射器的代码覆盖率。

有什么例子吗?

junit jax-rs quarkus exceptionmapper
2个回答
0
投票

这些只是正常的课程,

我可以提供一个示例,但对于单元测试,您只需将映射器实例化为普通类并调用“toResponse”方法,提供异常来获取响应,检查是否满足您的要求。

对于集成测试,您只需使用 RestAssured 调用您的服务并验证响应是否包含 ExceptionMapper 提供的状态和正文

映射器内部正在开发什么样的逻辑?


0
投票

通过资源测试异常映射器的另一种方法是使用 WireMock 返回其余客户端的错误。

休息客户端:

@RegisterRestClient(configKey = "foo-api")
public interface FooApi {
  @GET
  @Path("/foo")
  Foo getFoo();

  @ClientExceptionMapper
  static RuntimeException toException(final Response response, final Method method) {
    // your error handling
    return null;
  }
}

资源:

@Path("/foo")
public class FooResource {

  private FooApi fooApi;

  protected FooResource() {}

  @Inject
  public FooResource(@RestClient final FooApi fooApi) {
    this.fooApi = fooApi;
  }

  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Response get() {
    return Response.ok(fooApi.getFoo()).build();
  }
}

资源测试:

@QuarkusTest
@QuarkusTestResource(FooWebMock.class)
class FooResourceTest {
  @Test
  void testFoo() {
    given()
      .when()
      .get("/foo")
      .then()
      .statusCode(500)
      .body("message", equalTo("error"));
  }
}

QuarkusTestResourceLifecycleManager:

public class FooWebMock implements QuarkusTestResourceLifecycleManager {
  
  private WireMockServer wireMockServer;

  @Override
  public Map<String, String> start() {
    wireMockServer = new WireMockServer(8082);
    wireMockServer.start();
    configureFor(8082);

    stubFor(get(urlEqualTo("/foo"))
            .willReturn(aResponse()
                    .withStatus(500)
                    .withBody("{\"message\": \"error\"}")));

    return Map.of("quarkus.rest-client.foo-api.url", wireMockServer.baseUrl());
  }

  @Override
  public void stop() {
    if (wireMockServer != null) {
        wireMockServer.stop();
    }
  }
}

pom.xml

<dependency>
  <groupId>org.wiremock</groupId>
  <artifactId>wiremock</artifactId>
  <version>X.X.X</version>
  <scope>test</scope>
</dependency>
© www.soinside.com 2019 - 2024. All rights reserved.