【发布时间】:2022-01-23 05:40:15
【问题描述】:
我有一个 spring 云网关应用程序,它将请求路由到另一个服务。另一个服务定义了合约,这些合约在测试中由 Spring Cloud Gateway 应用程序作为存根导入。
现在我想在我的网关中进行合同测试,这将消耗另一个服务的存根。问题是我不知道如何将StubRunnerPort 作为属性/环境注入,以便我的配置类可以选择它并相应地配置路由:
Api网关路由配置
@Configuration
class GatewayConfig {
@Value("${subscriptions.url}")
private String subscriptionsUrl;
@Autowired
private TokenRelayGatewayFilterFactory tokenFilterFactory;
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.csrf(ServerHttpSecurity.CsrfSpec::disable);
return http.build();
}
@Bean
RouteLocator routeLocator(final RouteLocatorBuilder routeLocatorBuilder) {
return routeLocatorBuilder.routes()
.route("subscriptions", subscriptionsRoute())
.build();
}
private Function<PredicateSpec, Buildable<Route>> subscriptionsRoute() {
return spec -> spec
.path("/subscriptions/**")
.filters(s -> s.filter(tokenFilterFactory.apply()).prefixPath("/v1"))
.uri(subscriptionsUrl);
}
}
还有测试课:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {PnApiGatewayApp.class})
@AutoConfigureStubRunner(ids = "io.mkrzywanski:subscription-app:+:stubs", stubsMode = StubRunnerProperties.StubsMode.CLASSPATH)
@ActiveProfiles("test")
class SubscriptionSpec {
private WebTestClient webClient;
@LocalServerPort
private int port;
@StubRunnerPort("io.mkrzywanski:subscription-app")
private int stubRunnerPort;
@Autowired
ConfigurableEnvironment environment;
@BeforeEach
void setup() {
String baseUri = "http://localhost:" + port;
this.webClient = WebTestClient.bindToServer()
.responseTimeout(Duration.ofSeconds(10))
.baseUrl(baseUri).build();
}
@Test
void test() {
String body = "{\"userId\":\"22e90bbd-7399-468a-9b76-cf050ff16c63\",\"itemSet\":[{\"value\":\" Rainbow Six\"}]}";
var response = webClient.post()
.uri("/subscriptions")
.header("Authorization", "Bearer xxx")
.header("Content-type", MediaType.APPLICATION_JSON_VALUE)
.bodyValue(body)
.exchange()
.expectStatus().isCreated()
.expectBody(String.class)
.value(Matchers.equalTo("{\"subscriptionId : \"6d692849-58fd-439b-bb2c-50a5d3669fa9\"\"}"));
}
理想情况下,我希望 subscriptions.url 属性集 after 配置存根运行器,但 before 我的网关配置由 Spring 选择,以便 url 重定向起作用。
我已经尝试使用ApplicationContextInitializer,但是当初始化程序实例启动时,StubRunnerPort 似乎尚未配置。
所以问题是 - 如何获取存根运行器端口并使用它来将其注入其他服务 url,以便网关将请求路由到测试中的存根运行器?
【问题讨论】:
标签: java spring spring-boot spring-cloud-gateway spring-cloud-contract