【问题标题】:Micronaut return HttpResponse.serverError in controller not captured in unit testMicronaut 在控制器中返回 HttpResponse.serverError 未在单元测试中捕获
【发布时间】:2020-10-14 23:01:29
【问题描述】:

我正在测试一个 micronaut 控制器。控制器代码如下:

  @Get("/")
    HttpResponse<String> getData(String crsNumber ) {
        try {
            final HttpResponse response = formDataService.getData(crsNumber);
            return response;

        } catch (HttpClientException e) {
            return HttpResponse.serverError(e.getMessage());
        }
    }

单元测试代码如下:

when(formDataService.getData(anyString())).thenThrow(new HttpClientException("FormService Internal Error!"));

final HttpResponse rs = formControllerClient.getData("test");
Assertions.assertEquals(HttpStatus.SERVICE_UNAVAILABLE, rs.getStatus());

当抛出HttpClientException时,Controller确实捕获了它,并运行到返回语句:

return HttpResponse.serverError(e.getMessage());

但在单元测试中,

Assertions.assertEquals(HttpStatus.SERVICE_UNAVAILABLE, rs.getStatus());

从未到达,因为它会抛出

Internal Server Error
io.micronaut.http.client.exceptions.HttpClientResponseException: Internal Server Error
    at io.micronaut.http.client.netty.DefaultHttpClient$11.channelRead0(DefaultHttpClient.java:2046)
    at io.micronaut.http.client.netty.DefaultHttpClient$11.channelRead0(DefaultHttpClient.java:1964)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
    at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:190)
    at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:185)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)

知道为什么吗?

【问题讨论】:

  • 你能显示formControllerClient指向的类型的源代码吗?
  • 你能在你的单元测试中展示你的模拟链和你的控制器的完整代码吗?

标签: java unit-testing micronaut


【解决方案1】:

在这里发现问题:如果您返回超过 400 的错误代码,Micronaut 将抛出 HttpClientResponseException。

现在的单元测试完整代码:

@Test
public void callServiceErrorTest() throws InvalidKeySpecException, NoSuchAlgorithmException, JOSEException {
    when(formDataService.getData(anyString())).thenThrow(new HttpClientException("FormService Internal Error!"));

    final HttpClientResponseException exception = Assertions.assertThrows(HttpClientResponseException.class, () -> {
        formControllerClient.getData(jwtString);
    });

    Assertions.assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, exception.getStatus());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2022-07-27
    • 2016-10-29
    • 2014-05-11
    • 2017-05-08
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多