前言
在平常工做中,免不了自測 UT,由於覆蓋率不達標,是不容許提交測試,那怎麼進行 WebFlux 項目的測試呢。@WebFluxTest 是 WebFlux 測試的重要註解。css
結構
回到這個工程中,使用 springboot-webflux-3-mongodb 工程,工程如圖:java
目錄核心以下:react
- pom.xml 添加 Test 相關依賴;
- test / CityWebFluxControllerTest WebFlux API 測試類;
代碼 GiHub 詳見這裏。nginx
POM 依賴
pom.xml 添加對應的測試依賴:git
<!-- Spring Boot Test 依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency>
CityWebFluxControllerTest WebFlux API 測試類
@WebFluxTest 用於測試 Spring WebFlux 控制器,支持自動配置 Spring WebFlux 基礎組件,能夠限制掃描範圍等。github
代碼以下:web
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class CityWebFluxControllerTest { @Autowired private WebTestClient webClient; private static Map<String, City> cityMap = new HashMap<>(); @BeforeClass public static void setup() throws Exception { City wl = new City(); wl.setId(1L); wl.setProvinceId(2L); wl.setCityName("WL"); wl.setDescription("WL IS GOOD"); cityMap.put("WL", wl); } @Test public void testSave() throws Exception { City expectCity = webClient.post().uri("/city") .contentType(MediaType.APPLICATION_JSON) .body(BodyInserters.fromObject(cityMap.get("WL"))) .exchange() .expectStatus().isOk() .expectBody(City.class).returnResult().getResponseBody(); Assert.assertNotNull(expectCity); Assert.assertEquals(expectCity.getId(), cityMap.get("WL").getId()); Assert.assertEquals(expectCity.getCityName(), cityMap.get("WL").getCityName()); } }
代碼詳解:spring
- @WebFluxTest 注入了 WebTestClient 對象,用於測試 WebFlux 控制器,好處是快速,並沒有需啓動完整 HTTP 容器。
- WebTestClient.post() 方法構造了 POST 測試請求,並使用 uri 指定路由。
- expectStatus() 用於驗證返回狀態是否爲 ok(),即 200 返回碼。
- expectBody(City.class) 用於驗證返回對象體是爲 City 對象,並利用 returnResult 獲取對象。
- Assert 是之前咱們經常使用的斷言方法驗證測試結果。
運行 Test,獲得如圖驗證結果:mongodb
工程運行方式
瞭解工程服務器部署,先了解工程如何運行。apache
上面使用應用啓動類運行工程,這是其中一種工程運行方式。Spring Boot 應用的運行方式很簡單,下面介紹下這三種運行方式。
1. 使用應用啓動類
在 IDEA 中直接執行應用啓動類,來運行 Spring Boot 應用,平常開發中,會常常使用這種方式啓動應用。經常使用的會有 Debug 啓動模式,方便在開發中進行代碼調試和 bug 處理。天然,Debug 啓動模式會比正常模式稍微慢一些。
2. 使用 Maven 運行
經過 Maven 運行,須要配置 Spring Boot Maven 插件,在 pom.xml 配置文件中,新增 build 節點並配置插件 spring-boot-maven-plugin,代碼以下:
<build> <plugins> <!-- Spring Boot Maven 插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
在工程根目錄中,運行以下 Maven 命令來運行 Spring Boot 應用:
mvn spring-boot:run
實際調用的是 pom.xml 配置的 Spring Boot Maven 插件 spring-boot-maven-plugin,上面執行了插件提供的 run 指令。也能夠在 IDEA 右側工具欄的 Maven Project Tab 中,找到 Maven 插件的 spring-boot-maven-plugin,執行相應的指令。全部指令以下:
# 生成構建信息文件 spring-boot:build-info # 幫助信息 spring-boot:help # 從新打包 spring-boot:repackage # 運行工程 spring-boot:run # 將工程集成到集成測試階段,進行工程的聲明週期管理 spring-boot:start spring-boot:stop
3. 使用 Java 命令運行
使用 Maven 或者 Gradle 安裝工程,生成可執行的工程 jar 後,運行以下 Java 命令來運行 Spring Boot 應用:
java -jar target/xxx.jar
這裏運行了 spring-boot-maven-plugin 插件編譯出來的可執行 jar 文件。經過上述三種方式均可以成功運行 Spring Boot 工程,成功運行輸出的控制檯信息如圖 1-10 所示。
工程服務器部署
基礎環境安裝如上面說的,須要 JDK 環境、Maven 環境等。
Win 服務器
推薦使用 AlwaysUp:
使用方式也很簡單:
Linux 服務器
推薦 yum 安裝基礎環境,好比安裝 JDK:
yum -y list java* yum -y install java-1.8.0-openjdk* java -version
安裝 Maven:
yum -y list apache-maven sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo sudo yum install -y apache-maven mvn --v
Linux 使用 nohup 命令進行對後臺程序的啓動關閉。
關閉應用的腳本:stop.sh
啓動應用的腳本:start.sh
重啓應用的腳本:stop.sh
總結
這一篇主要一塊兒實踐了簡單的 WebFlux API 控制層的測試,Service 測試 Mock 和之前同樣,以及工程運行、服務器部署的操做。
工程:springboot-webflux-9-test。