【问题标题】:Feign Unit Testing Not found responseFeign 单元测试未找到响应
【发布时间】:2020-03-02 19:13:48
【问题描述】:

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

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

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

when(mockedApiClient.userDataDelete(anyString()))
                .thenThrow( ... );

我应该扔什么?

【问题讨论】:

    标签: java spring-cloud-feign


    【解决方案1】:

    除非提供任何其他更好的解决方案,否则我就是这样克服的......

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

    【讨论】:

    • 我不知道为什么,但我得到了非法状态异常而不是假装异常
    【解决方案2】:

    要在模拟服务时返回 404 Feign Exception,您可以尝试以下操作:

    1. 创建您自己的异常类,该类将扩展 Feign Exception。
    2. 使用 HttpStatus.NOT_FOUND 值注释响应状态。
    3. 重写构造函数,如下所示:
    import feign.FeignException;
    import org.springframework.http.HttpStatus;
    import org.springframework.web.bind.annotation.ResponseStatus;
    
    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    public class SampleFeignClientException extends FeignException {
    
        public SampleFeignClientException (String message, Throwable cause) {
            super(message, cause);
        }
    
        public SampleFeignClientException (String message, Throwable cause, byte[] content) {
            super(message, cause, content);
        }
    
        public SampleFeignClientException (String message) {
            super(message);
        }
    
        public SampleFeignClientException (int status, String message, byte[] content) {
            super(status, message, content);
        }
    }
    
    1. 在 Junit 测试用例中抛出创建的 sampleFeignException 类。
        @Test
        public void sampleTestMethod() {
            SampleFeignClientException sampleFeignClientException = new sampleFeignClientException(404, "NOT FOUND", new byte[1]);
    
             doThrow(sampleFeignClientException).when(mockService).method();
    
     }
    

    我希望这可以帮助您解决问题。

    【讨论】:

      【解决方案3】:

      嗯,对我来说,工作如下(我使用 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())
                      );
      

      【讨论】:

      • 谢谢,它工作正常;)。我发现您可以简单地传递一个空地图,而不是构建整个 headersErrorCollections.emptyMap()
      【解决方案4】:

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

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

      只需根据您的需要修改以上内容!需要注意的关键点是 Request 对象是强制性的。截至 2021 年,很少有像 Request.create 这样的重载被弃用。注意你用什么!

      希望对您有所帮助!快乐的编码!

      【讨论】:

      • 这应该是公认的答案
      猜你喜欢
      • 2018-07-04
      • 1970-01-01
      • 2018-09-10
      • 2016-03-16
      • 2013-06-07
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多