虚拟单元测试未找到响应

时间:2019-11-06 10:19:04

标签: java spring-cloud-feign

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

由于Feign正在针对404抛出FeignException,实现该测试用例的正确方法是什么?

我正在尝试类似的事情...

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

我应该扔什么?

4 个答案:

答案 0 :(得分:1)

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 这样的重载被弃用。注意你使用的东西!

希望有帮助!快乐编码!

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

要在模拟服务时返回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 :(得分:0)

好吧,我的工作如下(我使用 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())
                );
相关问题