我正在将应用程序从 Netflix/Zuul 迁移到 Spring Cloud Gateway:
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest)exchange.getRequest();
ServletServerHttpResponse serverHttpResponse = (ServletServerHttpResponse)exchange.getResponse();
if (shouldFilter(exchange)) {
try {
log.debug("Invoking authorization interceptor");
if (!checkRequest(
serverHttpRequest.getServletRequest(),
serverHttpResponse.getServletResponse(),
null)) {
return Mono.error(new RuntimeException("Invalid request"));
}
return chain.filter(exchange);
} catch (Exception exception) {
log.error(ERROR_MESSAGE, exception);
return Mono.error(exception);
}
}
return Mono.empty();
}
我写的测试用例如下:
private GatewayFilterChain filterChain
private static ServerWebExchange exchange;
def setup() {
exchange = mock(ServerWebExchange.class)
ServerHttpRequest request = mock(ServerHttpRequest.class)
ServerHttpResponse response = mock(ServerHttpResponse.class)
filterChain = mock(GatewayFilterChain.class)
when(filterChain.filter(exchange)).thenReturn(Mono.empty())
when(exchange.getRequest()).thenReturn(request)
when(exchange.getResponse()).thenReturn(response)
}
但是,在测试时,我收到以下错误:
java.lang.ClassCastException: class org.springframework.http.server.reactive.ServerHttpRequest$MockitoMock$6YiKyP1Z cannot be cast to class org.springframework.http.server.ServletServerHttpRequest (org.springframework.http.server.reactive.ServerHttpRequest$MockitoMock$6YiKyP1Z and org.springframework.http.server.ServletServerHttpRequest are in unnamed module of loader 'app')
我确实必须坚持使用
HttpServletRequest
和HttpServletResponse
中的jakarta
,否则重新实现下游服务将是一场噩梦。将 ServerHttpRequest 转换/转换为 HttpServletRequest 的最佳方法是什么?
是因为测试用例错误
应该是这样的
私有GatewayFilterChain过滤器链 私有静态 ServerWebExchange 交换;
def setup() {
exchange = mock(ServerWebExchange.class);
ServletServerHttpRequest servletRequest = mock(ServletServerHttpRequest .class);
ServletServerHttpResponse servletResponse = mock(ServletServerHttpResponse .class);
ServerHttpRequest request = mock(ServerHttpRequest.class)
ServerHttpResponse response = mock(ServerHttpResponse.class)
filterChain = mock(GatewayFilterChain.class)
when(filterChain.filter(exchange)).thenReturn(Mono.empty())
when(exchange.getRequest()).thenReturn(servletRequest )
when(exchange.getResponse()).thenReturn(servletResponse )
when(servletRequest .getRequest()).thenReturn(request)
when(servletResponse .getResponse()).thenReturn(response)
}