Spring,webflux:当从WebTestClient执行请求时,ServerHttpRequest对象的getRemoteAddress方法返回null

Spring,webflux:当从WebTestClient执行请求时,ServerHttpRequest对象的getRemoteAddress方法返回null,spring,spring-test,spring-webflux,Spring,Spring Test,Spring Webflux,我有一个控制器 @RestController public class NameController { @Autowired private NameService nameService; @GetMapping("/name") public Mono<UploadParamsDto> getName(ServerHttpRequest request) { return nameService.getNameByH

我有一个控制器

@RestController
public class NameController {

    @Autowired
    private NameService nameService;

    @GetMapping("/name")
    public Mono<UploadParamsDto> getName(ServerHttpRequest request) {
            return nameService.getNameByHost(request.getRemoteAddress().getHostName());
    }
}
当我运行测试以检查我的getName方法时,我得到了NPE,因为 request.getRemoteAddress()返回null,您能告诉我如何模拟ServerHttpRequest吗?(我知道有MockServerHttpRequest,但我无法使用它)


我的目的是发出请求。getRemoteAddress().getHostName()返回模拟值。

使用
@WebFluxTest
运行测试并不涉及真正的服务器,您已经了解了这一点

但是得到一个
NullPointerException
仍然感觉不太对-你能就此提出一个问题吗?我认为您不必解决这个问题,但是Spring框架应该提供一些基础设施来“模拟”这些信息。

谢谢大家。 工作方式如下:

@ExtendWith(SpringExtension.class)
@WebFluxTest(NameControllerTest.class)
@ActiveProfiles("test")
class NameControllerTest {

    @Autowired
    private ApplicationContext context;

    @Test
    void nameTest() {

        WebTestClient webClient = WebTestClient
                    .bindToApplicationContext(context)
                    .webFilter(new SetRemoteAddressWebFilter("127.0.0.1"))
                    .configureClient()
                    .build();

        webClient.get().uri("/name")
                .accept(MediaType.APPLICATION_JSON)
                .exchange()
                .expectStatus()
                .isOk();
    }
}
其中SetRemoteAddressWebFilter是WebFilter:

public class SetRemoteAddressWebFilter implements WebFilter {

    private String host;

    public SetRemoteAddressWebFilter(String host) {
        this.host = host;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        return chain.filter(decorate(exchange));
    }

    private ServerWebExchange decorate(ServerWebExchange exchange) {
        final ServerHttpRequest decorated = new ServerHttpRequestDecorator(exchange.getRequest()) {
            @Override
            public InetSocketAddress getRemoteAddress() {
                return new InetSocketAddress(host, 80);
            }
        };

        return new ServerWebExchangeDecorator(exchange) {
            @Override
            public ServerHttpRequest getRequest() {
                return decorated;
            }
        };
    }
}
公共类SetRemoteAddressWebFilter实现WebFilter{
私有字符串主机;
公共SetRemoteAddressWebFilter(字符串主机){
this.host=host;
}
@凌驾
公共Mono筛选器(服务器WebExchange exchange、WebFilterChain链){
返回链。过滤器(装饰(交换));
}
专用服务器WebExchange(服务器WebExchange){
final ServerHttpRequest装饰=新的ServerHttpRequestDecorator(exchange.getRequest()){
@凌驾
公共InetSocketAddress getRemoteAddress(){
返回新的InetSocketAddress(主机,80);
}
};
返回新服务器WebExchangeCorator(exchange){
@凌驾
公共服务器HttpRequest getRequest(){
返回装饰;
}
};
}
}

这是一个很好的解释吗?
public class SetRemoteAddressWebFilter implements WebFilter {

    private String host;

    public SetRemoteAddressWebFilter(String host) {
        this.host = host;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        return chain.filter(decorate(exchange));
    }

    private ServerWebExchange decorate(ServerWebExchange exchange) {
        final ServerHttpRequest decorated = new ServerHttpRequestDecorator(exchange.getRequest()) {
            @Override
            public InetSocketAddress getRemoteAddress() {
                return new InetSocketAddress(host, 80);
            }
        };

        return new ServerWebExchangeDecorator(exchange) {
            @Override
            public ServerHttpRequest getRequest() {
                return decorated;
            }
        };
    }
}