我正在使用两个异常映射器,responseExceptionMapper 和ExceptionMapper。 现在我需要这些映射器的代码覆盖率。
有什么例子吗?
这些只是正常的课程,
我可以提供一个示例,但对于单元测试,您只需将映射器实例化为普通类并调用“toResponse”方法,提供异常来获取响应,检查是否满足您的要求。
对于集成测试,您只需使用 RestAssured 调用您的服务并验证响应是否包含 ExceptionMapper 提供的状态和正文
映射器内部正在开发什么样的逻辑?
通过资源测试异常映射器的另一种方法是使用 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>