私は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
リクエストを行うポイントをモックし、偽のレスポンスを返してもらいたいです。つまり、呼び出しをモックする必要があるため、リクエストがthis call sitefeign.Client.Default.execute
になったときに偽の応答が返されます。そのモックがどのように見えるかの例:
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
クラスはモックされません。私は何を間違っていますか?