マイクロサービス間の通信には Spring-Cloud-Netflix を使用しています。Foo と Bar という 2 つのサービスがあり、Foo が Bar の REST エンドポイントの 1 つを使用しているとします。次の注釈が付けられたインターフェイスを使用します@FeignClient
。
@FeignClient
public interface BarClient {
@RequestMapping(value = "/some/url", method = "POST")
void bazzle(@RequestBody BazzleRequest);
}
SomeService
次に、Foo にサービス クラスがあり、 BarClient
.
@Component
public class SomeService {
@Autowired
BarClient barClient;
public String doSomething() {
try {
barClient.bazzle(new BazzleRequest(...));
return "so bazzle my eyes dazzle";
} catch(FeignException e) {
return "Not bazzle today!";
}
}
}
ここで、サービス間の通信が機能することを確認するために、WireMock などを使用して、偽の Bar サーバーに対して実際の HTTP 要求を発行するテストを構築したいと考えています。このテストでは、feign がサービス応答を正しくデコードし、それを に報告することを確認する必要がありますSomeService
。
public class SomeServiceIntegrationTest {
@Autowired SomeService someService;
@Test
public void shouldSucceed() {
stubFor(get(urlEqualTo("/some/url"))
.willReturn(aResponse()
.withStatus(204);
String result = someService.doSomething();
assertThat(result, is("so bazzle my eyes dazzle"));
}
@Test
public void shouldFail() {
stubFor(get(urlEqualTo("/some/url"))
.willReturn(aResponse()
.withStatus(404);
String result = someService.doSomething();
assertThat(result, is("Not bazzle today!"));
}
}
そのような WireMock サーバーを eureka に挿入して、feign がそれを見つけて通信できるようにするにはどうすればよいですか? どのような注釈マジックが必要ですか?