【发布时间】:2017-01-20 19:35:57
【问题描述】:
我使用 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 能够找到它并与之通信?我需要什么样的注释魔法?
【问题讨论】:
-
我试图为您提供答案,但我知道您的目标很可能不是很好。如果您谈论集成测试,那么您不需要模拟
BarClient逻辑。如果您这样做,那么您的测试将是单元测试,而不是集成。如果它是一个单元测试,那么你可以使用 Mokito 模拟BarClientsimple,根本不需要 http 请求。我不明白你为什么需要http请求? -
我不想构建集成多个微服务的集成测试。当我说集成测试时,我的意思是测试
FooService中所有技术层的集成,而不是只测试一个类并用模拟或存根替换其余部分的单元测试。 -
你看过RestClientTest,它是Spring Boot 1.4中的
MockRestServiceServer吗? -
你找到方法了吗?我正在努力实现同样的目标。在进程外模拟运行所有外部依赖项(例如 Eureka 服务器)的微服务。
-
正如您在下面的回答中看到的,我切换到了 RestTemplate。
标签: java netflix-eureka spring-cloud-netflix wiremock feign