spring-webflux - 在@WebFluxTest 中访问 WebSession
问题描述
我有一个这样的控制器:
@RestController
public class ApiController {
@GetMapping(path = "/somethings")
public Mono<String> getThings(final WebSession webSession) {
if (!webSession.getAttribute("state").equals("started")) {
throw new RuntimeException("Cannot make API calls until session has started");
}
// Make api calls here...
}
}
在我的@WebFluxTest 中,我需要访问网络会话以将“状态”属性设置为“已启动”。
有没有办法在@WebFluxTest 中访问和更新 WebSession?
解决方案
找到了答案。
WebTestClient 有一个mutateWith方法,您可以在其中传递WebTestClientConfigurer。
通过创建自定义 WebTestClientConfigurer 可以添加会话属性。
public class SessionMutator implements WebTestClientConfigurer {
private static Map<String, Object> sessionMap;
private SessionMutator(final Map<String, Object> sessionMap) {
this.sessionMap = sessionMap;
}
public static SessionMutator sessionMutator(final Map<String, Object> sessionMap) {
return new SessionMutator(sessionMap);
}
@Override
public void afterConfigurerAdded(final WebTestClient.Builder builder,
final WebHttpHandlerBuilder httpHandlerBuilder,
final ClientHttpConnector connector) {
final SessionMutatorFilter sessionMutatorFilter = new SessionMutatorFilter();
httpHandlerBuilder.filters(filters -> filters.add(0, sessionMutatorFilter));
}
public static ImmutableMap.Builder<String, Object> sessionBuilder() {
return new ImmutableMap.Builder<String, Object>();
}
private static class SessionMutatorFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain webFilterChain) {
return exchange.getSession()
.doOnNext(webSession -> webSession.getAttributes().putAll(sessionMap))
.then(webFilterChain.filter(exchange));
}
}
}
然后在@WebFluxTest 中可以执行以下操作:
webTestClient.mutateWith(sessionMutator(sessionBuilder().put("sessionKey", "sessionValue").build()))
推荐阅读
- javascript - .Net Core 和 Node.JS 版本控制
- java - Spring MVC 自定义格式化程序在测试中工作但在浏览器中失败
- c# - Xamarin.Foms GoogleMaps MoveToRegion 不起作用
- angular - 检查后表达式已更改-MatDialog Angular 6
- java - 修改嵌套for循环,根据xml标签创建多个xml文件
- c# - 从弹性豆茎访问 SNS 超时
- javascript - JavaScript - 当使用 let 而不是 var 时,练习的解决方案不起作用
- javascript - 尝试动态调整图像上的图标大小
- swift - 以编程方式控制 macOS 鼠标 - Swift 4
- php - 使用 PHP 重定向到另一个页面