Feign 单元测试未找到响应

aga*_*con 6 java spring-cloud-feign

我正在尝试实现一个涉及 FeignClient 调用的单元测试,该调用应返回 404 Not Found。

由于 Feign 抛出了 404 异常,那么实现这个测试用例的正确方法是什么?

我正在尝试这样的事情......

when(mockedApiClient.userDataDelete(anyString()))
                .thenThrow( ... );
Run Code Online (Sandbox Code Playgroud)

我应该扔什么?

Dee*_*and 12

Feign 已经提供了像 NotFound 和其他典型的 HTTP 响应代码类型这样的内部类。此处显示了一个示例。

Request request = Request.create(Request.HttpMethod.GET, "url",
                    new HashMap<>(), null, new RequestTemplate());
            throw new FeignException.NotFound("", request, null);
Run Code Online (Sandbox Code Playgroud)

根据您的需要修改上面的内容即可!需要注意的关键一点是 Request 对象是强制性的。截至 2021 年,一些重载(例如 Request.create)已被弃用。注意你用的是什么!

希望有帮助!快乐编码!

  • 这应该是公认的答案 (2认同)

Fla*_*iva 6

嘲笑你的FeignException


var ex = Mockito.mock(FeignException.class);
Mockito.when(ex.status()).thenReturn(404);
Mockito.when(mockedApiClient.userDataDelete(anyString()))
       .thenThrow(ex);

Run Code Online (Sandbox Code Playgroud)


小智 5

好吧,对我来说工作如下(我使用 EasyRandom 作为某些字段的生成器):

private EasyRandom easyRandom = new EasyRandom();
 Map<String, Collection<String>> headersError = easyRandom.nextObject(HashMap.class);
 byte[] bodyError = easyRandom.nextObject(byte[].class);

 when(mockedApiClient.userDataDelete(anyString())
                .thenThrow(FeignException.errorStatus(
                        "userDataDelete",
                        Response.builder()
                                .status(404)
                                .reason("message error")
                                .request(Request.create(
                                        Request.HttpMethod.POST,
                                        "foo/foo/bar/v1/delete-data-user",
                                        headersError, //this field is required for construtor//
                                        null,
                                        null,
                                        null))
                                .body(bodyError)//this field is required for construtor
                                .build())
                );
Run Code Online (Sandbox Code Playgroud)


aga*_*con 2

除非提供任何其他更好的解决方案,这就是我克服这个问题的方法......

when(mockedApiClient.userDataDelete(anyString()))
                .thenThrow(FeignException.errorStatus(
                        "userDataDelete",
                        Response.builder()
                                .status(404)
                                .headers(new HashMap<>())
                                .reason("Not found").build()));
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么,但我得到非法状态异常而不是假装异常 (6认同)