我正在尝试实施涉及FeignClient调用的单元测试,该调用应返回404 Not Found。
由于Feign正在针对404抛出FeignException,实现该测试用例的正确方法是什么?
我正在尝试类似的事情...
when(mockedApiClient.userDataDelete(anyString()))
.thenThrow( ... );
我应该扔什么?
答案 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,可以尝试以下方法:
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);
}
}
@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())
);