使用@WebFluxTest 测试 RouterFunction
Using @WebFluxTest to test RouterFunction
我有一个路由器功能,我想使用 spock
进行测试。看起来像这样
@Configuration
public class WebConfig {
/**
* Router function.
* @return string
*/
@Bean
public RouterFunction<?> helloRoute() {
return route(GET("/judge/router/hello"),
request -> ServerResponse.ok().body(fromPublisher(Mono.just("Hello Router WebFlux"), String.class)));
}
}
它的测试看起来像这样
@WebFluxTest
class JudgeRuleEngineMvcTestSpec extends Specification {
@Autowired
WebTestClient webClient;
def "router function returns hello"() {
expect:
webClient.get().uri("/judge/router/hello")
.exchange()
.expectStatus().isOk()
.expectBody(String.class)
.isEqualTo("Hello WebFlux") // should fail
}
}
但它失败了,因为它不是 200
状态,而是 returns 404
。它似乎无法找到 REST
本身。
我还用 GetMapping
测试了基本 RestController
,效果很好。
@RestController
@RequestMapping("/judge/rest")
public class BasicController {
private static final Logger LOGGER = LoggerFactory.getLogger(BasicController.class);
@GetMapping("/hello")
public Mono<String> handle() {
LOGGER.debug("Invoking hello controller");
return Mono.just("Hello WebFlux");
}
}
def "mvc mono returns hello"() {
expect:
webClient.get().uri("/judge/rest/hello")
.exchange()
.expectStatus().isOk()
.expectBody(String.class)
.isEqualTo("Hello WebFlux")
}
为什么路由器功能失败?
这是 @WebFluxTest
的一个已知限制 - 目前没有一致的方法来检测 RouterFunction
bean,就像我们检测 @Controller
类.
要添加到 ,kizux 在他发布的 Github 问题 link 中似乎提到了一个解决方法
您可以bindToApplicationContext
使用WebTestClient测试路由器功能
引用
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {RouteConfiguration.class, UserHandler.class})
@WebFluxTest
public class UserHandlerTest
{
@Autowired
private ApplicationContext context;
@MockBean(name="userService")
private UserService userService;
private WebTestClient testClient;
@Before
public void setUp()
{
testClient = WebTestClient.bindToApplicationContext(context).build();
}
...
我有一个路由器功能,我想使用 spock
进行测试。看起来像这样
@Configuration
public class WebConfig {
/**
* Router function.
* @return string
*/
@Bean
public RouterFunction<?> helloRoute() {
return route(GET("/judge/router/hello"),
request -> ServerResponse.ok().body(fromPublisher(Mono.just("Hello Router WebFlux"), String.class)));
}
}
它的测试看起来像这样
@WebFluxTest
class JudgeRuleEngineMvcTestSpec extends Specification {
@Autowired
WebTestClient webClient;
def "router function returns hello"() {
expect:
webClient.get().uri("/judge/router/hello")
.exchange()
.expectStatus().isOk()
.expectBody(String.class)
.isEqualTo("Hello WebFlux") // should fail
}
}
但它失败了,因为它不是 200
状态,而是 returns 404
。它似乎无法找到 REST
本身。
我还用 GetMapping
测试了基本 RestController
,效果很好。
@RestController
@RequestMapping("/judge/rest")
public class BasicController {
private static final Logger LOGGER = LoggerFactory.getLogger(BasicController.class);
@GetMapping("/hello")
public Mono<String> handle() {
LOGGER.debug("Invoking hello controller");
return Mono.just("Hello WebFlux");
}
}
def "mvc mono returns hello"() {
expect:
webClient.get().uri("/judge/rest/hello")
.exchange()
.expectStatus().isOk()
.expectBody(String.class)
.isEqualTo("Hello WebFlux")
}
为什么路由器功能失败?
这是 @WebFluxTest
的一个已知限制 - 目前没有一致的方法来检测 RouterFunction
bean,就像我们检测 @Controller
类.
要添加到
您可以bindToApplicationContext
使用WebTestClient测试路由器功能
引用
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {RouteConfiguration.class, UserHandler.class})
@WebFluxTest
public class UserHandlerTest
{
@Autowired
private ApplicationContext context;
@MockBean(name="userService")
private UserService userService;
private WebTestClient testClient;
@Before
public void setUp()
{
testClient = WebTestClient.bindToApplicationContext(context).build();
}
...