我正在编写一个Dropwizard
应用程序并Feign
用于构建对外部服务的客户端调用。我有我正在注册的自定义编码器和解码器,feign.Builder
如下所示:
this.feignBuilder = Feign.builder()
.contract(new JAXRSContract()) // we want JAX-RS annotations
.encoder(new JacksonEncoder()) // same as what dropwizard is using
.decoder(new CustomDecoder())
.errorDecoder(new CustomErrorDecoder())
.requestInterceptor(new AuthKeyInterceptor(config.getInterceptor()));
我正在为feign
客户端调用编写单元测试,因此我可以观察 feign 机器如何处理我的编码器/解码器覆盖和异常冒泡。我现在对使用假服务器编写集成测试不感兴趣(这是我看到人们为这种情况编写的最常见的测试类型)。
这应该是直截了当的。我想模拟feign
发出请求的点并让它返回我的假响应。这意味着我应该模拟调用,feign.Client.Default.execute
以便它在发出请求时返回我的虚假响应this call site。该模拟的示例如下:
String responseMessage = "{\"error\":\"bad\",\"desc\":\"blah\"}";
feign.Response feignResponse = FeignFakeResponseHelper.createFakeResponse(404,"Bad Request",responseMessage);
Client.Default mockFeignClient = mock(Client.Default.class);
try {
when(mockFeignClient.execute(any(feign.Request.class),any(Request.Options.class))).thenReturn(feignResponse);
} catch (IOException e) {
assertThat(true).isFalse(); // fail nicely
}
没运气。当我到达代码中请求的调用站点Cleint.Default
时,该类不会被嘲笑。我究竟做错了什么?