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



假设我有一个简单的网络过滤器,它只写一个反应器上下文

WebFilter filter = (serverWebExchange, webFilterChain) ->
webFilterChain
.filter(serverWebExchange)
.contextWrite(Context.of("my-key", true));

我想测试会是这样的:

StepVerifier.create(filter.filter(serverWebExchange, webFilterChain)
.expectAccessibleContext()
.hasKey("my-key")
.then()
.verifyComplete();

但我不知道如何模拟webFilterChain以确保Context被编写。

Mockito.when(webFilterChain.filter(any()).thenReturn(???)

有什么想法吗?

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

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();

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

因为方法webFilterChain.filter(any())不返回任何内容(它是一个void方法(,我建议验证是否调用了该方法:

Mockito.verify(webFilterChain, times(1)).filter(any());

最新更新