如何为正在编写 Reactor Context 的 WebFilter 编写单元测试?具体来说,我要嘲笑什么以及如何嘲笑?

kan*_*ane 4 java junit unit-testing reactor spring-webflux

假设我有一个简单的 webfilter,它只写一个反应器上下文

WebFilter filter = (serverWebExchange, webFilterChain) ->
    webFilterChain
        .filter(serverWebExchange)
        .contextWrite(Context.of("my-key", true));
Run Code Online (Sandbox Code Playgroud)

我想测试会是这样的:

StepVerifier.create(filter.filter(serverWebExchange, webFilterChain)
    .expectAccessibleContext()
    .hasKey("my-key")
    .then()
    .verifyComplete();
Run Code Online (Sandbox Code Playgroud)

但我不知道如何模拟webFilterChain以确保上下文已写入。

Mockito.when(webFilterChain.filter(any()).thenReturn(???)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

小智 5

我有同样的问题,这是我的解决方案

WebFilterChain filterChain = filterExchange -> Mono.empty();
MockServerWebExchange exchange = MockServerWebExchange.from(
    MockServerHttpRequest
        .get("/your-url")
        .header("my-key", "value"));

StepVerifier.create(yourFilter.filter(exchange, filterChain))
    .expectAccessibleContext()
    .hasKey("my-key")
    .then()
    .verifyComplete();
Run Code Online (Sandbox Code Playgroud)

https://github.com/spring-projects/spring-framework/blob/main/spring-web/src/test/java/org/springframework/web/cors/reactive/CorsWebFilterTests.java