将 WebClient 与 Spring MVC 结合使用时更正要使用的依赖项

Correct dependencies to use when using WebClient with Spring MVC

我正在使用 Spring MVC 来开发一些控制器。

我想编写一些场景集成测试,这将涉及调用我的应用程序的多个控制器。

通常我会在这些测试中使用 RestTemplate 但文档指出:

Please, consider using the org.springframework.web.reactive.client.WebClient which has a more modern API and supports sync, async, and streaming scenarios.

所以我想使用 WebClient 编写面向未来的代码。但我有几个问题:

  1. 这里应该包含哪些依赖项?
 // (1) For Spring MVC:
 'org.springframework.boot:spring-boot-starter-web:2.4.1'
 // (2) For spring webflux
 'org.springframework.boot:spring-boot-starter-webflux:2.4.1'

问题是我同时拥有 (1) 和 (2) 是不是包含了太多东西?是否有一个单独的依赖项,我应该专门包含它以访问 WebClient?还是同时包含这两项是最佳做法?

  1. 我应该使用 WebClient 还是 TestWebClient 编写测试?

鉴于我只想在我编写的集成测试中向我的服务器发出 HTTP 请求 - 我认为使用 WebClient 可以吗?或者在这类测试中更喜欢使用 TestWebClient?最佳做法是什么?

已测试将使用 TestRestTemplate 的现有集成测试转换为使用 WebTestClient

的集成测试
package no.mycompany.myapp.user;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.reactive.server.WebTestClient;

@AutoConfigureWebTestClient
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class LoginControllerTest {

    @Autowired
    WebTestClient webTestClient;
        
    @Test
    public void postLogin_withoutUserCredentials_receiveUnauthorized() {
        webTestClient.post()
                .uri("/login")
                .exchange()
                .expectStatus().isUnauthorized();
    }
}

将此添加到 POM

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <scope>test</scope>
    </dependency>

POM 中已有以下内容

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>