Я пытаюсь использовать Spring Cloud Contract с сервисом отдыха, использующим маршрутизацию Spring 5, но он не работает.Я на стороне клиента, и я пытаюсь использовать заглушку в тесте Junit.Если я использую классический @RestController и flux, он работает нормально, но если я пытаюсь изменить контроллер с помощью RouterFunction, он не работает, и я получаю 404. Это мой пример кода.
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
...
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-contract-stub-runner</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Routing.java
@Configuration
@EnableWebFlux
public class Routing {
@Autowired
private TestLoginController loginController;
@Bean
public HttpHandler routerFunction() {
return WebHttpHandlerBuilder
.webHandler(RouterFunctions.toWebHandler(createRouterFunction()))
.build();
}
private RouterFunction<ServerResponse> createRouterFunction() {
return route(POST("/testlogin"), loginController::testLogin);
}
}
TestLoginController.java
@Component
public class TestLoginController {
@Autowired
private TestLoginService testLoginService;
public Mono<ServerResponse> testLogin(ServerRequest request) {
return Mono.just(request)
.flatMap(req -> ServerResponse.ok()
.body(testLoginService.testLogin(request.bodyToMono(LoginRequest.class)), LoginResponse.class)
);
}
}
DemoApplicationTest.java
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureStubRunner(ids = {"groupId:artifactId:+:stubs:8090"},
stubsMode = StubRunnerProperties.StubsMode.LOCAL)
public class DemoApplicationTests {
@LocalServerPort
private int port;
@Test
public void contextLoads() throws Exception {
LoginRequest request = new LoginRequest();
WebTestClient
.bindToServer()
.baseUrl("http://localhost:" + port)
.build()
.post()
.uri("testlogin").accept(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromObject(request))
.exchange()
.expectStatus().isOk()
.expectBody()
....
}
}
У меня такая же проблема дажеесли я удалю аннотацию @AutoConfigureStubRunner.Если я только добавлю зависимость от заглушек, я пойму это поведение, то найду эту проблему.Я также пытался использовать последнюю версию весенней загрузки и весеннего облачного контракта, но у меня та же проблема.кто-нибудь может мне помочь?