将 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) 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?还是同时包含这两项是最佳做法?
- 我应该使用 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>
我正在使用 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) 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?还是同时包含这两项是最佳做法?
- 我应该使用 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>