接受的答案有主要思路。但是在一些地方我遇到了困难,直到找出问题所在。因此,我想展示一个更完整的答案,同时也使用了Wiremock。
测试:
@ActiveProfiles("test")
@TestPropertySource(locations = "classpath:/application-test.yml")
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWireMock(port = 5001)
public class ZuulRoutesTest {
@LocalServerPort
private int port;
private TestRestTemplate restTemplate = new TestRestTemplate();
@Before
public void before() {
stubFor(get(urlPathEqualTo("/1/orders/")).willReturn(aResponse()
.withHeader("Content-Type", MediaType.TEXT_HTML_VALUE)
.withStatus(HttpStatus.OK.value())));
}
@Test
public void urlOrders() {
ResponseEntity<String> result = this.restTemplate.getForEntity("http://localhost:"+this.port +"/api/orders/", String.class);
assertEquals(HttpStatus.OK, result.getStatusCode());
verify(1, getRequestedFor(urlPathMatching("/1/.*")));
}
}
还有application-test.yml
文件:
zuul:
prefix: /api
routes:
orders:
url: http://localhost:5001/1/
cards:
url: http://localhost:5001/2/
这应该可以工作。
但是对于我来说,Wiremock有一些限制。如果您有代理请求在不同的端口上运行不同的主机名,就像这样:
zuul:
prefix: /api
routes:
orders:
url: http://lp-order-service:5001/
cards:
url: http://lp-card-service:5002/
在同一端口上运行的本地 Wiremock 将无法帮助您。我仍在尝试找到类似的集成测试,其中我可以模拟 Spring 中的 Bean,并读取 Zuul 代理在进行请求调用之前选择路由的 url
。
Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: strategie
。我猜想这是因为Zuul配置期望从服务发现服务器(在本例中为Eureka)获取信息,以将调用路由到正确的IP地址。 - Juan Vega