Spring, webflux: метод getRemoteAddress объекта ServerHttpRequest возвращает ноль при выполнении запроса из WebTestClient - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть контроллер

@RestController
public class NameController {

    @Autowired
    private NameService nameService;

    @GetMapping("/name")
    public Mono<UploadParamsDto> getName(ServerHttpRequest request) {
            return nameService.getNameByHost(request.getRemoteAddress().getHostName());
    }
}

, и у меня есть метод теста:

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

    @Autowired
    private WebTestClient webClient;

    @Test
    void nameTest() {
        webClient.get().uri("/name")
                .accept(MediaType.APPLICATION_JSON)
                .exchange()
                .expectStatus()
                .isOk();
    }
}

Когда я запускаю тест, чтобы проверить мой метод getName, я получил NPE, потому что запрос.getRemoteAddress () возвращает null, не могли бы вы рассказать, как смоделировать ServerHttpRequest?(Я знаю, что существует MockServerHttpRequest, но я не смог с ним справиться)

Моя цель - сделать request.getRemoteAddress (). GetHostName () вернуть ложное значение.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Спасибо всем.Работает следующим образом:

@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;
            }
        };
    }
}
0 голосов
/ 13 декабря 2018

Выполнение теста с @WebFluxTest не требует реального сервера, вы уже поняли это.

Но получить NullPointerException не все равно правильно - вы могли бы создать проблему наhttps://jira.spring.io об этом?Я не думаю, что вам придется обходиться с этим, но Spring Framework, вероятно, должен предоставить некоторую инфраструктуру, чтобы «высмеивать» эту информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...