我使用 Spring-Cloud-Netflix 进行微服务之间的通信。假设我有两个服务,Foo 和 Bar,Foo 使用 Bar 的 REST 端点之一。我使用带有 @FeignClient
注释的接口:
@FeignClient
public interface BarClient {
@RequestMapping(value = "/some/url", method = "POST")
void bazzle(@RequestBody BazzleRequest);
}
然后我在 Foo 中有一个服务类 SomeService
,它调用 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 能够找到它并与之通信?我需要什么样的注解魔法?
原文由 Bastian Voigt 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用 Spring 的 RestTemplate 而不是 feign。 RestTemplate 也可以通过 eureka 解析服务名称,所以你可以这样做:
使用 Wiremock 比 feign 更容易测试。