欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Spring Boot RestClient單元測試實戰(zhàn):MockRestServiceServer與WireMock方案解析

Spring Boot RestClient單元測試實戰(zhàn):MockRestServiceServer與WireMock方案解析 1. 先別急著寫測試搞清楚 RestClient 到底是什么1.1 版本號這件事6.1 其實是 Spring Framework 的版本看到標題里寫著“Spring Boot 6.1”估計不少人和我一開始一樣愣了一下因為 Spring Boot 的版本號目前主線是 3.x而 6.1 是 Spring Framework 的版本號Spring Boot 3.2 開始就是基于 Spring Framework 6.1 的。所以“Spring Boot 6.1”這個說法如果理解成“Spring Framework 6.1 Spring Boot 3.2”在技術上是完全成立的RestClient 正是 Spring Framework 6.1 新增的同步 HTTP 客戶端。這個細節(jié)不是摳字眼它直接影響你查文檔、搜資料、引依賴時的準確性。我在工作中遇到過好幾個同事在 Maven 里找spring-boot-starter-restclient找了半天發(fā)現(xiàn)沒有這個 starter因為 RestClient 不在單獨的 starter 里它跟著spring-web模塊走。Spring Boot 3.2 的spring-boot-starter-web、spring-boot-starter-webflux甚至spring-boot-starter-web-services里都有它但如果你用的是 WebFlux 的 starter又想要同步的 RestClient 行為那就得額外引spring-web的依賴這里面的細微差別踩坑的人不少。RestClient 的定位非常清晰它要替代的是 RestTemplate。RestTemplate 從 Spring 5.0 開始就被官方標記為維護模式不會再加新功能了但團隊里用它的老項目又特別多因為大家習慣了它那種同步、直接、寫起來不繞彎的風格。WebClient 雖然功能強大、異步非阻塞但學習成本確實高對于只想要“發(fā)一個 GET 請求拿個 JSON 回來”這種場景WebClient 顯得有點殺雞用牛刀。RestClient 就是在這個背景下出現(xiàn)的保留 RestTemplate 那種直觀的同步編碼體驗同時把 API 設計得更加鏈式、流暢把 UriBuilder、ExchangeFilterFunction、消息轉換器這些 WebClient 的優(yōu)點也吸收了過來。1.2 RestClient 與 RestTemplate、WebClient 怎么選很多朋友問我一個問題我現(xiàn)在要新寫一個服務間調(diào)用到底選哪個我給團隊定的參考思路是這樣的維度RestTemplateWebClientRestClient編碼風格命令式簡單直接響應式鏈式回調(diào)/流式命令式 鏈式最接近現(xiàn)代寫法異步支持不支持傳統(tǒng)同步阻塞完美支持非阻塞暫不支持異步純同步學習成本低中高低與 Spring 生態(tài)契合度低進入維護模式高高官方主推適合場景老項目維護高并發(fā)、網(wǎng)關、流式調(diào)用絕大多數(shù)服務間同步調(diào)用這里多說一句異步的事。RestClient 本身是同步設計但 Spring 官方在 6.1 里同時提供了RestClient的響應式兄弟RestClient的 WebClient 變體即用 RestClient 的鏈式語法包著 WebClient 實現(xiàn)不過日常用不到咱不展開。我的判斷標準很樸素如果你的接口調(diào)用方本身不是高性能網(wǎng)關也沒有流式推送需求就用 RestClient它寫出來的代碼最好讀、最好維護。1.3 為什么單元測試這個主題值得單拎出來寫說實話我見過太多團隊使用 RestTemplate 或 RestClient 時測試只有兩種狀態(tài)要么不寫要么寫一個 mock 掉整個 Service 層的“假單元測試”真正到了 HTTP 客戶端這一層就裸奔了。等哪天第三方接口聯(lián)調(diào)出問題線上日志打出來的錯誤是ConnectTimeoutException還是ResourceAccessException好多人分不清楚更別提怎么在測試里模擬出這兩種不同的超時場景。RestClient 引入的新 API 剛出來一年左右網(wǎng)上關于它的單元測試文章不少但質(zhì)量參差不齊有些直接照搬 WebClient 的測試方案有些用的還是舊版RestTemplate的過時 API照著抄很容易掉坑里。這篇文章我會從方案選型、代碼實現(xiàn)、常見報錯三個層面把 RestClient 單元測試這件事掰開揉碎講清楚項目代碼也是我自己在 Spring Boot 3.2.4 基礎上跑通的可以放心抄。2. 設計方案單測 RestClient 的 3 種主流思路2.1 思路一MockRestServiceServer 輕量模擬MockRestServiceServer是 Spring 官方專門為 RestTemplate 提供的測試工具在 Spring Framework 6.1 之后它同步支持對 RestClient 的 mock。這個方案的核心思路非常樸素你家的服務要去請求第三方接口測試里我不想真去請求那我就給這個“網(wǎng)絡請求”套一個代理測試代碼里預先定義好“如果收到某個 URL 的 GET 請求就返回指定的 JSON 字符串”。它最大的優(yōu)點是簡單、快速、沒有額外依賴也不需要起一個真實的 socket 端口。缺點也明顯它 mock 的是底層 request factory而不是真實網(wǎng)絡棧所以它測不到 DNS 解析、連接池、真實超時這些網(wǎng)絡層面的問題。但作為單元測試這完全夠用了因為你本來就不想在單測里真的發(fā)起外部調(diào)用。實現(xiàn)方式上用MockRestServiceServer.bindTo(RestClient.Builder)把測試服務綁定到 builder 上然后在測試中server.expect(...)寫期望的請求和返回。這里有一個從 RestTemplate 遷移過來的注意點RestTemplate 時代調(diào)用MockRestServiceServer.createServer(restTemplate)就夠了但 RestClient 因為采取了 builder 模式你需要把 server 綁定到 builder 再讓 builder 構建出 RestClient否則測試里 mock 不生效。2.2 思路二WireMock 模擬真實 HTTP 服務如果你希望測試盡可能接近真實 HTTP 調(diào)用比如要驗證 header 里的認證信息、要模擬第三方服務返回 500/超時等異常場景WireMock 是更好的選擇。它本質(zhì)上是在測試進程里啟動一個真正的 HTTP 服務器然后你的 RestClient 像訪問真實服務一樣訪問這個本地端口。WireMock 的優(yōu)勢是“真”RestClient 從連接建立、發(fā)送請求、讀取響應到解析 JSON 的完整鏈路都會執(zhí)行一遍如果底層配置有問題比如連接池設置、超時邏輯用 WireMock 能暴露出來。缺點是測試啟動稍慢、需要管理端口和生命周期如果項目里所有單測都用它CI 時長會明顯增加。這兩套方案怎么取舍我的經(jīng)驗是純 Service 層的單測用 MockRestServiceServer涉及 HTTP 協(xié)議細節(jié)的集成測試用 WireMock。還有一種更“重”的方案是用 Testcontainers 起一個容器化的 MockServer但那種一般留給端到端測試單測階段引入容器反而增加了不穩(wěn)定性不建議一上來就這么豪橫。2.3 要不要拉起來 Spring 容器關于這個問題我見過兩種極端一種人寫單測動不動SpringBootTest把所有 Bean 全部加載測一個小 Client 要等 30 秒另一種人連容器都不碰純手動 new 對象但遇到 RestClient.Builder 注入、依賴別的配置類時又無從下手。我的建議是分場景如果只是測一個簡單的 Client 方法、驗證 URL/header/body完全不需要啟動 Spring 容器手動RestClient.builder()構建然后綁定 MockRestServiceServer 即可。但如果你配置了自定義的ClientHttpRequestInterceptor、Jackson消息轉換器或者依賴了配置文件的某些屬性那就用SpringBootTestAutoConfigureMockRestServiceServer讓 Spring 幫你把 builder 注入好測試只關注業(yè)務斷言這更符合“集成測試”的定位。2.4 先寫測試還是先寫功能代碼國內(nèi)團隊對這個問題的態(tài)度兩極分化要么嚴格執(zhí)行 TDD要么完全跳過測試。我自己的體會是RestClient 這種外部調(diào)用代碼先寫測試的價值比普通 CRUD 代碼更大因為它要對接的接口是你不可控的第三方你必須在寫業(yè)務代碼前就確定好請求格式、響應結構、異常處理邏輯。你先寫一個“我想讓某個請求返回什么數(shù)據(jù)”的測試相當于先把協(xié)議定下來再寫實現(xiàn)就不容易跑偏。我常用的節(jié)奏是先定義接口 DTO再寫一個空實現(xiàn)然后寫測試用例正常返回、404、500、超時四種情況最后補實現(xiàn)代碼讓測試變綠。這樣做的好處是你會在寫測試的過程中發(fā)現(xiàn)很多設計上的問題比如響應的 JSON 有嵌套字段你沒考慮到、有些 header 是動態(tài)生成的、第三方接口分頁結構和你預期不一致這些問題提前暴露比聯(lián)調(diào)時暴露成本低得多。3. 實操過程MockRestServiceServer 方案一步步落地3.1 準備環(huán)境和依賴先交代一下工程環(huán)境JDK 17Spring Boot 3.x 的最低要求、Spring Boot 3.2.4、Spring Framework 6.1.5、Maven 3.9。JDK 8 的老項目想用 RestClient 就不用想了升 JDK 17 是硬前提。Maven 依賴不需要額外的測試庫直接用 spring-boot-starter-testdependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency注意如果項目里沒引spring-boot-starter-web只引了spring-boot-starter-webflux那么 RestClient 類在spring-web模塊中已經(jīng)有了但有些 HTTP 客戶端工廠比如 JDK HttpURLConnection 的默認實現(xiàn)在 WebFlux 環(huán)境下的測試行為會有差異建議還是統(tǒng)一用 web starter省得排查半天。3.2 先寫一個待測的 Client 類假設我們正在做一個“上門烹飪預約服務”后端其中一個功能是調(diào)用外部菜單服務獲取廚師信息。這個場景取自真實業(yè)務很能體現(xiàn) RestClient 的使用方式。package com.example.cooking.client; import com.example.cooking.dto.ChefDto; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.client.RestClient; import java.util.List; Component public class ChefServiceClient { private final RestClient restClient; public ChefServiceClient(Qualifier(chefServiceRestClient) RestClient restClient) { this.restClient restClient; } public ChefDto getChefById(Long id) { return restClient.get() .uri(/api/chefs/{id}, id) .accept(MediaType.APPLICATION_JSON) .retrieve() .body(ChefDto.class); } public ListChefDto listChefsByCity(String city) { return restClient.get() .uri(uriBuilder - uriBuilder .path(/api/chefs) .queryParam(city, city) .build()) .accept(MediaType.APPLICATION_JSON) .retrieve() .body(new ParameterizedTypeReferenceListChefDto() {}); } }這里的Qualifier(chefServiceRestClient)是為了區(qū)分不同的 RestClient Bean當系統(tǒng)里同時有多個服務需要調(diào)用時不要都在同一個 RestClient 上疊 baseUrl給每個下游服務一個獨立配置的 Client 是更清晰的設計。3.3 配置 RestClient 的 Bean在Configuration類中定義 RestClient Bean并設置連接超時和讀取超時package com.example.cooking.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.JdkClientHttpRequestFactory; import org.springframework.web.client.RestClient; import java.net.http.HttpClient; import java.time.Duration; Configuration public class RestClientConfig { Bean(chefServiceRestClient) public RestClient chefServiceRestClient( Value(${chef.service.base-url}) String baseUrl) { HttpClient httpClient HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(3)) .build(); JdkClientHttpRequestFactory requestFactory new JdkClientHttpRequestFactory(httpClient); requestFactory.setReadTimeout(Duration.ofSeconds(5)); return RestClient.builder() .baseUrl(baseUrl) .requestFactory(requestFactory) .defaultHeader(X-Request-Source, cooking-platform) .build(); } }這里我選了 JDK 自帶的 HttpClient 作為底層實現(xiàn)如果你想用 Apache HttpClient 5.x需要額外引入依賴并配置連接池但單測場景沒有區(qū)別。注意JdkClientHttpRequestFactory在啟動時就會創(chuàng)建一個HttpClient如果項目中還有復雜的 HTTP/2 或連接池配置需求建議換成HttpComponentsClientHttpRequestFactory。3.4 核心寫 MockRestServiceServer 測試類終于寫到最關鍵的部分了。由于 RestClient 使用了 builder 模式MockRestServiceServer 綁定時有特殊要求我一開始直接套用了 RestTemplate 時代的寫法結果發(fā)現(xiàn) mock 根本攔截不到請求后來仔細看了官方文檔才明白問題出在哪。正確的完整測試代碼如下package com.example.cooking.client; import com.example.cooking.dto.ChefDto; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestClient; import java.util.Arrays; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.client.match.MockRestRequestMatchers.*; import static org.springframework.test.web.client.response.MockRestResponseCreators.*; class ChefServiceClientTest { private MockRestServiceServer mockServer; private ChefServiceClient client; BeforeEach void setUp() { RestClient.Builder builder RestClient.builder() .baseUrl(http://chef-service.internal); mockServer MockRestServiceServer.bindTo(builder).build(); client new ChefServiceClient(builder.build()); } Test void testGetChefById_whenThirdPartyReturnsData_shouldDeserializeOk() { // given String json { id: 1001, name: 張師傅, specialty: 川菜, rating: 4.8 } ; mockServer.expect(requestTo(/api/chefs/1001)) .andExpect(method(HttpMethod.GET)) .andExpect(header(X-Request-Source, cooking-platform)) .andRespond(withSuccess(json, MediaType.APPLICATION_JSON)); // when ChefDto result client.getChefById(1001L); // then assertThat(result.getId()).isEqualTo(1001L); assertThat(result.getName()).isEqualTo(張師傅); assertThat(result.getSpecialty()).isEqualTo(川菜); mockServer.verify(); } Test void testListChefsByCity_whenNoData_shouldReturnEmptyList() { // given mockServer.expect(requestToUriStartingWith(/api/chefs?city上海)) .andExpect(method(HttpMethod.GET)) .andRespond(withSuccess([], MediaType.APPLICATION_JSON)); // when ListChefDto result client.listChefsByCity(上海); // then assertThat(result).isEmpty(); mockServer.verify(); } }這個測試類有個很重要的細節(jié)MockRestServiceServer.bindTo(builder).build()會在底層包裝 builder之后任何通過這個 builder 創(chuàng)建的 RestClient 請求都會被它攔截。verify()放在最后斷言所有聲明的期望請求都被匹配到一個都不能多一個也不能少。3.5 異常場景怎么測RestClient 默認繼承了 RestTemplate 的異常處理方式4xx 拋出HttpClientErrorException5xx 拋出HttpServerErrorException連接失敗拋出ResourceAccessException。這些異常場景在測試中很容易模擬Test void testGetChefById_whenServerReturns500_shouldThrowHttpServerErrorException() { mockServer.expect(requestTo(/api/chefs/2000)) .andExpect(method(HttpMethod.GET)) .andRespond(withServerError()); assertThatThrownBy(() - client.getChefById(2000L)) .isInstanceOf(HttpServerErrorException.class) .hasMessageContaining(500); } Test void testGetChefById_whenThirdPartyTimeout_shouldThrowResourceAccessException() { // 通過 withException 模擬連接異常 mockServer.expect(requestTo(/api/chefs/3000)) .andExpect(method(HttpMethod.GET)) .andRespond(withException(new ConnectTimeoutException(connect timed out))); assertThatThrownBy(() - client.getChefById(3000L)) .isInstanceOf(ResourceAccessException.class) .hasMessageContaining(connect timed out); }這里我想強調(diào)一個容易混淆的概念讀超時Read Timeout和連接超時Connect Timeout是兩個不同的異常MockRestServiceServer 單測里能模擬的是“連接層”的異常因為請求根本沒發(fā)出去。如果你想驗證讀超時的處理邏輯得用 WireMock 或 Testcontainers 起真實服務然后讓服務端故意睡眠超過讀超時時間這個在線上排查特別有用。3.6 配合 SpringBootTest 的寫法如果項目里配置比較多想直接把測試環(huán)境拉起來可以用下面的方式SpringBootTest AutoConfigureMockRestServiceServer class ChefServiceClientIntegrationTest { Autowired private ChefServiceClient client; Autowired private MockRestServiceServer mockServer; Test void testGetChefById_withSpringContext() { mockServer.expect(requestTo(/api/chefs/1001)) .andRespond(withSuccess({\id\:1001,\name\:\李師傅\}, MediaType.APPLICATION_JSON)); ChefDto result client.getChefById(1001L); assertThat(result.getName()).isEqualTo(李師傅); mockServer.verify(); } }用AutoConfigureMockRestServiceServer時Spring Boot 會自動替換容器里的 RestClient.Builder 為 mock 版你的測試類不需要有任何綁定邏輯。但這個方案要求被注入的 RestClient 確實是項目中配置的同一個 builder 構建的如果代碼里new RestClient那神仙也攔不住。4. WireMock 方案實戰(zhàn)連協(xié)議棧一起測4.1 什么時候必須用 WireMock年初我們團隊對接了一個第三方“菜品識別服務”對方文檔沒寫好響應里有時候返回 JSON有時候返回純文本還有時候返回的 JSON 字段名大小寫不一致。MockRestServiceServer 這種“模擬”方式在這種場景下就使不上勁了因為不管真實服務返回什么MockRestServiceServer 給你的 response 都是你定義的字符串它測不到 RestClient 和消息轉換器之間的協(xié)商過程。這時候把請求打到真實服務上、然后讓真實服務“聽你指揮”才是檢驗正確性的唯一標準。WireMock 干的就是這個事。4.2 引入 WireMock 并編寫測試Maven 添加依賴dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency dependency groupIdcom.github.tomakehurst/groupId artifactIdwiremock-standalone/artifactId version3.3.1/version scopetest/scope /dependency測試代碼package com.example.cooking.client; import com.example.cooking.dto.ChefDto; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.WireMock; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; import org.springframework.web.client.RestClient; import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.assertj.core.api.Assertions.assertThat; class ChefServiceClientWireMockTest { private WireMockServer wireMockServer; private ChefServiceClient client; BeforeEach void setUp() { wireMockServer new WireMockServer(8089); wireMockServer.start(); WireMock.configureFor(localhost, 8089); RestClient restClient RestClient.builder() .baseUrl(http://localhost:8089) .build(); client new ChefServiceClient(restClient); } AfterEach void tearDown() { wireMockServer.stop(); } Test void testGetChefById_withWireMock() { stubFor(get(urlEqualTo(/api/chefs/1001)) .willReturn(aResponse() .withStatus(200) .withHeader(Content-Type, application/json) .withBody({\id\:1001,\name\:\王師傅\,\specialty\:\粵菜\,\rating\:4.9}))); ChefDto result client.getChefById(1001L); assertThat(result.getName()).isEqualTo(王師傅); verify(getRequestedFor(urlEqualTo(/api/chefs/1001))); } }WireMock 跑起來之后RestClient 發(fā)請求就像打真實服務一樣DNS、端口、連接、HTTP 協(xié)議全過程都會走一遍這能暴露一些 MockRestServiceServer 永遠發(fā)現(xiàn)不了的問題。比如我們團隊之前就遇到過ChefDto里有個LocalDateTime字段普通 JSON 序列化沒問題但第三方服務返回的是yyyy-MM-dd HH:mm:ss這種非 ISO 格式在 MockRestServiceServer 里因為 response 直接走消息轉換器解析根本沒報警WireMock 下同樣的 JSON 結果解析報錯才暴露出問題最后加了JsonFormat注解才解決。4.3 在單元測試里模擬延遲和超時剛才提到的讀超時場景WireMock 很容易模擬Test void testReadTimeout() { stubFor(get(urlEqualTo(/api/chefs/slow)) .willReturn(aResponse() .withFixedDelay(6000) // 人為延遲 6 秒 .withBody({}))); RestClient timeoutClient RestClient.builder() .baseUrl(http://localhost:8089) .requestFactory(new JdkClientHttpRequestFactory( HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(3)) .build())) .build(); // 需要單獨設置讀超時 JdkClientHttpRequestFactory factory (JdkClientHttpRequestFactory) timeoutClient.getRequestFactory(); factory.setReadTimeout(Duration.ofSeconds(2)); assertThatThrownBy(() - timeoutClient.get() .uri(/api/chefs/slow) .retrieve() .toBodilessEntity()) .isInstanceOf(ResourceAccessException.class) .hasMessageContaining(Read timed out); }有一點要提醒JdkClientHttpRequestFactory的讀超時必須在構建RestClient之后單獨設置如果一開始就在HttpClient構建時設置connectTimeout那只影響連接階段不影響讀取階段。這個坑我遇到過不止一次線上排查超時問題時要分清楚是連接超時還是讀超時。5. 常見問題與排查技巧實錄5.1 報了Unexpected request是什么原因怎么定位這是 MockRestServiceServer 最經(jīng)典的報錯意思是有請求發(fā)出來了但你測試里沒有對這次請求做過期望聲明或者期望聲明的 URL/method 對不上。最常見的原因是 RestClient 實際請求的 URL 和你預期的不一致。排查技巧把異常堆棧完整拉出來里面會帶著實際請求的 method 和 URI對照你測試里expect的 matcher 逐項核對。另外特別提醒 URL 里的 query 參數(shù)requestTo(/api/chefs?city上海)這種寫法對中文參數(shù)和你預期不一致時很容易誤判建議用queryParam逐項匹配而不是拼字符串。5.2 RestClient 類找不到或者版本不兼容RestClient是 Spring 6.1 引入的類如果你用的 Spring Boot 3.1 或更早即使引了spring-web類也是不存在的。這時候 IDE 會報ClassNotFoundException或編譯錯誤別糾結直接升 Spring Boot 到 3.2。還有一個很少人注意的點如果項目里手動指定了 Spring Framework 版本開發(fā)環(huán)境 Spring Boot 用的 6.1.x但內(nèi)部某個模塊鎖定了 6.0.x那也會出現(xiàn)類找不到Maven 依賴樹里查一下spring-web的版本即可。5.3 MockRestServiceServer mock 沒生效請求打到了真實服務發(fā)生這種情況九成是 RestClient 實例不是你綁定后那個 builder 創(chuàng)建的。仔細檢查一下MockRestServiceServer.bindTo(builder).build()之后你的被測類是否用的是這個 builder.build()出來的 RestClient如果被測類自己內(nèi)部RestClient.create()或者 new 了一個那 mock 自然攔不到。另外檢查是否多個RestClientBean 有同名的質(zhì)量問題Qualifier指定錯了也會導致注入的不是同一個實例。5.4 JSON 反序列化報錯但接口文檔明明沒錯使用 RestClient 時./body()的解析依賴消息轉換器自動協(xié)商 content-type。如果第三方返回的Content-Type是application/json;charsetUTF-8沒問題但如果第三方服務不規(guī)范返回了text/plain或者根本沒有 Content-TypeRestClient 會認為響應不是 JSON走默認的消息轉換器結果自然是反序列化失敗或者拿到一個 String。解決辦法在 Client 的請求代碼里顯式指定.accept(MediaType.APPLICATION_JSON)并且與第三方約定響應頭必須帶application/json。這個看著是小事但排查起來最容易讓人懷疑人生我見過有人在這個問題上卡了兩天。5.5 測試用例之間互相影響如果你在同一個測試類里寫了多個測試方法且都用BeforeEach綁定 MockRestServiceServer那么每個測試方法運行前都會新建一個 server 實例用例之間互不干擾。但如果用了SpringBootTest且測試類標注Transactional事務會貫穿整個測試此時第三方服務調(diào)用不會被事務回滾影響別指望 mock 會在事務結束后自動恢復需要在BeforeEach里手動重置 server。用 WireMock 時多個測試類并行跑可能發(fā)生端口沖突建議每個測試類指定一個獨立端口不要全部用8089這種固定值CI 上爆端口沖突是常事。5.6 “SQL執(zhí)行10秒自動關閉”這類配置會不會影響 RestClient 測試很多人會把 RestClient 和數(shù)據(jù)庫連接池的超時概念搞混這里順手捋一下。Spring Boot 中關于“SQL 執(zhí)行 10 秒自動關閉”這類說法一般是指連接池的連接回收時長時間不歸還或事務超時它影響的范圍是數(shù)據(jù)庫連接和 HTTP 客戶端的超時完全是兩條線。RestClient 的超時配置在ClientHttpRequestFactory層與 JDBC 無關。所以你在測試 RestClient 時不需要也沒必要依賴 Spring 的spring.datasource.*超時配置連接超時和讀超時都在 RestClient 自己的 RequestFactory 里設置。測試時為了不等待過久通常把 connectTimeout 設 1~3 秒、readTimeout 設 2~5 秒即可線上再根據(jù)接口實際響應時間放寬。5.7 測試時遇到JdkClientHttpRequestFactory和 HttpURLConnection 混用Spring Boot 3.2 默認的ClientHttpRequestFactory是JdkClientHttpRequestFactory但在某些 Spring Boot 小版本上如果 classpath 里有 Apache HttpClient 或 Jetty 的客戶端自動配置可能選擇其他工廠。這會導致你在本地跑測試時沒問題一到 CI 就發(fā)現(xiàn) RestClient 行為不一致比如代理設置、連接池參數(shù)全變了。建議在配置類里顯式指定requestFactory不要依賴容器自動選擇這樣測試和生產(chǎn)環(huán)境行為才一致。如果你像我一樣習慣在RestClientConfig里手動構建就把JdkClientHttpRequestFactory或你選擇的工廠實現(xiàn)固定寫死。6. 實操心得我踩過幾次坑之后的幾點體會寫這篇文章之前我把團隊里所有用到 RestClient 的模塊翻了一遍發(fā)現(xiàn)很多測試代碼還在用 RestTemplate 時代的MockRestServiceServer.createServer()老寫法這讓我挺感慨的??蚣芨?lián)Q代速度很快但很多人的測試知識還停留在上一代 API 上。我覺得 RestClient 的單元測試核心要把握住三點方案選型看需求——純單元測試用 MockRestServiceServer需要驗證 HTTP 細節(jié)用 WireMock響應類型要匹配——單個對象用ChefDto.class集合用ParameterizedTypeReference不要混用異常要全覆蓋——正常返回、4xx、5xx、連接異常、讀超時這五類場景都該有測試第三方接口才敢放心調(diào)。最后再分享一個小技巧MockRestServiceServer的expect支持一次聲明多個請求的期望如果被測代碼里循環(huán)調(diào)用了多次接口可以用expect(requestTo(...)).andExpect(...).andRespond(...)連續(xù)寫多個最后統(tǒng)一verify()。但如果你對一個 URL 期望了兩次且兩次返回的內(nèi)容不一樣建議用andRespond的不同響應或MockRestResponseCreators的withSuccess參數(shù)變體分別處理不要讓測試變成“最后一次賦值生效”那樣排錯會非常痛苦。對于剛接觸 RestClient 的讀者我建議先把 3.4 節(jié)的基礎測試跑通再把 3.5 的異常場景補上最后再去研究 WireMock。測試是寫給未來的自己看的一個能快速定位問題的測試類比什么架構理念都實在。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲av成人一区二区电影在线| 五月天婷婷丁香成人网| 精品,99| 色婷婷色综合| 国外亚洲成AV人片在线观看| 亚洲第一第二网站| 婷婷久月| 夜夜撸夜夜骑| 婷婷丁香激情综合色情| 九月色婷婷综合| 小骚穴电影| 少妇伦子伦精品无吗| 欧美色色色色色色色色色色| 熟女激情五月天| 久久久久久xxxxx| av第一二区| 九八Av| 丁香五月性| 激情网综合| 五月婷婷在线短视频| 色色网91| jiuse91在线| 中文幕无线码中文字蜜桃| 激情av在线| 九九热在线视频,| 大香蕉婷婷色| 九九Av| 久久婷婷激情四射五月天| 五月天丁香| 婷婷色在线视频| 色丁香五月婷婷在线| 亚洲思思热久| 婷婷五月天美女| 久久性爱视频这里只有精品| 五月丁香六月婷婷亚洲| 天天成人综合视频| 色婷视频| 噜噜狠狠色| 色情五月天A片| 开心深爱五月天| WWW,激情五月天,COM| 丁香五月婷婷综合精品素人| 国内一级精品| 噜噜色天天开心| 色色五月天网站| 久久婷婷五月综合啪| 日韩熟女啪啪视频| 99热99草97| 香蕉视频性爱BB做爱| 狠狠精品干练久久久无码中文字幕| 婷婷久久综合| 丁香网站| 九九Y精品热播| 在线成人va| 国产成人精品一区二三区熟女在线| 久久婷婷伊人| 婷婷五月天97干| 清纯唯美 激情四射| 九九色婷婷五月天| 91无码高清| 在线99精品| 六月激情网| 五月丁香亭亭AV女优| 婷婷 丁香 久久| 婷婷九月狠狠色| 无码色| 五月丁香综合在线| 青青草成人网| 五月丁香婷婷色播无码| 色综合大香蕉| 99久久99热这里只有精品| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 综合视频久久| 五月丁香网站在线播放| 99re8在这里只有精品| 欧美大道不卡| 国产日产亚系列精品版优势| 丁香蜜臀黄色婷婷五月天| 另类激情五月| 国语精品探花| 色五月亚洲| 亚州美女| 婷婷五月综合久久中文字幕| 天天檫天天爽| 六月色色| 精品一区二区三区三区| 色色色视频免费无码 | 久久精品五月| 国产精品-第3页-91JQ就要激情网91JQ5.JQJQ926.XYZ | 丁香五月天视频| 综合网色| 操人精品| 五月婷婷婷自由综合| 99热这里只有精品2| 日韩aaaaa| 日韩色色视频| 另类激情四射| 99视频网| 这里只有精9| 激情婷婷六月| 国产特级毛片AAAAAAA高清| 伊人在线另类| 六月婷婷视频| 久久女婷| 色婷婷综合亚洲| 欧美成人无码一区二区三区| 色99热| 天堂成人A片永久免费网站| 欧美亚洲成人在线| 操人妻视频91| 五月婷婷久草| 五月婷婷综合色啪| 五月花婷婷| #NAME?| 高潮毛片遮挡费高一百度| 99热成人在线观看| 嫩草AV久久伊人妇女超级A| 91av视频在线观看最新网址| 激情五月天色婷婷| ztEJj| 日本九九九九| 国产亚洲99久久精品| 超碰五月婷婷五月天| 国产99美少妇| 国产 码在线成人网站| 丁香婷婷91在线观看视频| 天天摸日日舔狠狠添婷婷婷 | 久久草大香蕉| 99在线视频免费| A在线观看| 我淫我色婷婷五月天激情四射| 99ri精品视频在线观看| 久久人人超| 久人人操| 91人操人人人操人| 亚洲六月色婷婷| 久久这里只有国产精品视频| 亚洲色就是色色色| 丁香五月综合网亚洲综合欧美狠狠| 色色色99| 五月婷婷久久爱| 欧美人妻一区二区| 日本的α片xxxwww| 婷婷五月激情黄色| 日韩精品无码99| 丁香六月婷婷| 丁香五月天激情AV| 婷婷色狠狠| 99热综合在线观看| 久久婷婷五月综合色和| 亚洲色五月婷婷| 在线不卡AC| 亭亭五月激情亚洲在线| 色婷狠狠| 欧美天堂久久| 精品国产va久久久久| 天天干天天操天天拍| 色丁香五月婷婷| 色色五月天丁香| 色婷婷激情| 五月丁香福利| 亚洲色激婷| 亚洲精品无码一区二区| 欧美va欧美va差| 伊人爱爱日本| 成人在线视频一区| 99色这里| 97伦乱| 亚洲、热| 9l视频自拍9l视频自拍九色学生| 五月天激情综合| 青青操avbb| 精品夜夜澡人妻无码AV| 99热免费在线| 99色区| 激情五月综合网| 五月综合777| 五月综合激情啪啪啪啪啪| 丁香婷婷五月综合影院| 99碰网站| 国产69久久久欧美黑人A片| 青草热视频这里只有精品| 免费精品66| 国产婷婷色综合AV蜜臀AV| 三十路磁力链接| 成人久碰| 国产无套精品一区二区| 日本颜色视频人人爱| 99久操| 人妻久久久久久久 | 成熟妇人A片免费看网站| 人妻自慰高清合集| 99久久精| 婷婷色情五月| 91人人人人人| 色九月| 五月婷婷丁香大陆免费| 免费婷婷| 99热很操老逼| 图片区 小说区 区 亚洲五月| 99热这里只有免费精品| 久热视频A.| 色婷婷激情Av久久久| www.五月天婷婷| 六月五月丁香五月欧美| 26.uuu丁香五月婷婷| 思思热在线| 人人射人人高潮| 五月丁香啪啪啪| 国产成人综合亚洲| 伊人色综合网| 婷婷色网| 久久网日本| 99色播| 日韩综合天堂| 视频1区2区| 五月婷婷在线免费| 激情综合国产| 色色综合色| 久操人妻| 操日视频| 免费亚洲成人电影AV| 日日噜噜夜夜狠狠久久丁香六月| 激情丁香九九五月综合网| 久99久热只有精品国产99| 六月婷欧美| 五月婷婷香蕉| 91男人操女人视频| 亚洲妇女熟BBW| 婷婷五月综合网| av中文网站| 婷婷五月天日本国产| 婷婷四色五月| 无码人妻电影| 五月丁香激情综合网| 天堂网操| 丁香五月综合激情久久潮喷| 97操碰在线97| 色色色9 9 9| 91久久网站| 9精品久久999| 亚洲激情四射色| 超碰99在线| 99ri在线视频| 五月婷婷激情久久| 996热| 色九月婷婷综合| 五月天综合在线观看| 新伍月婷婷| 五月婷人妻| 日本激情ⅩXX免费视频| 亚洲综合干| 婷婷免费精品视频| 亚洲午夜AV| 日韩视频99| 五月丁香久久久久| 五月亭亭开心网| 六月婷婷激情| 精品人妻伦一二三区久久| 激情久久五月天| 婷婷在线播放| 国产亚洲色婷婷久久99精品91| 国产精品色婷婷久久久精品| 色婷婷久久综合| 久久在这里99| 日本99热| 丁香五月欧美婷婷| 久久电影4399| 色综合色欲综合天天免费 | 91综合视频丁香| 久久9情免费| 亚洲亚洲人成综合网络| 日日操无码| 丁香激情五月天| 丁香五月婷婷综合激情啪啪啪啪啪啪啪| 96丁香婷婷九月蜜桃综合久久| 操人妻AV| 五月婷婷影| WWW久久久| 欧美成性色| 五月丁香视频在线观看| 第四色五月天| 99无码视频| 成人.在线日韩| 99网址在线观看| 久久大香蕉伊人| 超碰人人射| 六月丁香婷婷亚洲中文玖玖| 久久激情五月| 五月天丁香| 亚洲AV无码成人电影| 五月婷婷激情久久| 99热在线播放| 色综合久久88色综合天天| 2015WWW永久免费观看播放| 草一草avb| 77799热| 午夜色丁香| 久久伦乱| 婷婷色网址| 色99在线视频| 婷婷五月无码| 午夜69成人做爰视频| 超级碰 久久9| 深爱激情小说五月婷婷| 99视频35精品视频在线观看| 99干免费视频| 五月天婷婷一起草| 97干视频在线| 亚洲人成播放网站| www色婷婷久久综合久色| 五月天婷婷在线AN| 亚洲精品又粗又大又爽A片| 日韩成人电泉AV| 丁香五月激情婷婷| 五月综合久久| 亚洲综合色婷婷文学| 狠狠色色| 色天堂A| 日韩在线看AV| 久久久er热| 99热思思| 大香蕉婷婷婷| 五月天成人在线| 色色吧综合| 久久综合站| 久久精品色| 综合成人小说婷婷| 大香蕉伊然在亚洲90| 婷婷丁香射射| 五月婷婷综合激情| 色情五月婷| 婷婷精品性性性性性性性| 色五月六月| 噜噜视频| 99热观看| 久色视频| 五月综合丁| 婷婷五月天激情五月天网站| 中文字幕有多少字| 色五月丁香一区在线| 91久久| 久re在线| 丁香五月天成人网站| 色啦啦视频| 六月激情婷婷综合| 六月成人网| 色婷婷五月六月丁香综合视频| 欧美日本黄色| 五月婷婷丁香综合| 久久婷五月| 丁香婷婷五月色成人网站| 99这里只有精品|v| 九九 激情 网| 五月激情啪啪啪| 综合性爱网| 婷婷五月天AV| 9l视频自拍9l九色9l成人| 日日夜夜婷婷| 看全色黄大色大片| 久久视频婷婷视频| 深爱五月月天| 国产精品第一国产精品| 婷婷狠狠五月综合| 日日操无码| 成人综合伍月天| 亚洲日本三级片| 五月丁香激情欧洲啪啪| 操婷婷久久| 亚洲无码色色| 久久99久久99精品免观看粉嫩| 色在线99| 五月天婷亚洲综合在线嫩草网| 色婷婷狠狠| 玖玖在线视频| 久九男女天堂| 99视频| 精品亚洲国产成AV人片传媒| 开心激情站| 色五月婷婷开心| 丁香六月在线综合| www.久久爱.com| 丁香六月久久| 久久A极片| 五月天激情AV| 久操热线| 婷婷丁香五月综合网| 天堂草在线观看| 久久99看免费| 国产99久久久国产精品免费看| 天天狠狠插| 丁香六月婷婷激情| 久久九九热视频| 丁香五月综合图片在线观看| A1片久久| 丁香五月社区| 久久五月丁香| 亚洲99激情| www.久99| 婷婷五月花| 麻豆五月丁香婷婷| 色综合激情| 青青草国产亚洲精品久久| 天天做天天摸| 色五月激情问网站| 久久影视婷婷五月| 熟女少妇内射日韩亚洲| 色婷婷www| 色婷丨日丨天丨综合久久| 国产永久一黄| 一本色道久久88综合日韩精品| 五月丁香六月激情欧美综合| 色宗合,宗合网| 亚洲激情六月丁香| 久久久99精品免费观看| 91综合在线| 五月开行婷婷色五月| 久热一本| 丁香97综合| 天天日天天插| 五月丁香六月激情综合| 五月色天情| 五月丁香激情片| 色色婷婷婷丁香五月天| 4399无码视频| 欧美性生交XXXXX无码小说| 99精品网| 综合久久五月天| 五月天婷婷午夜丁香| 月色色综合婷婷网| 国产免费一区二区三州老师F1……| 亚洲性爱电影| 中文字幕激情综合| 狠狠干夜夜干| 人人噜天天上| 亚洲丁香五月在线观看| 五月的婷婷六月丁香| 人人操插| 操逼视频一区| 国产精品色婷婷久久久精品| 婷婷伊人綜合| 大香蕉丁香| 国产精品久久久久9999小说| 丁香五月av| 99九九精品| 在线中文亚洲| 99毛片| 婷婷成人视频| 播五月,色五月,开心五月播放器| 色婷婷社区| 丁香六月婷| 97人人做| 中文无码婷婷| 91超碰九色| 人人澡玖玖一| 很很干天天干| 久久99综合| 激情小说婷婷| 成人做爰A片免费看视频| 精品久久人妻| 亚洲亚洲人成综合网络| 国产成人精品一区二区三区视频| 国产AV一区二区三区最新精品| 天天天天操| 婷婷五月天伊人网| 天天日天天插| 性欧美大战久久久久久久83| 99国产99| 婷婷五月综合网激情| 激情国产五月| 丁香五月婷婷婷桃花影院| 青青草原爱爱网| 中文字幕婷婷在线| 婷婷五月丁香啪啪| 亚洲中文丁香| 天天色综合网1| 日韩AAAAAAAAAAA片| 99热这里只有精品1| 97欧美在线| 九九黄色网| 激情婷婷六月天| 人妻熟人中文字幕一区二区| 亚洲殴洲精品Av在线| 美国不卡视频| 97在线视频观看| 五月天亚洲最大成人| 久久婷婷亚洲五月天| 深爱激情网综合| 国产密乳av一区二区三区四区| 九九热re99re6在线精品| 久久99网站| AA片在线观看视频在线播放| 婷五月天| 天天激情综合| 久久久免费精彩视频| 99自拍网| 丁香婷婷十月| 成人国产综合| 婷婷五月丁香图片人人操| 大香伊人婷婷| AAAA亚洲| 99久久久久久www| 久久精彩视频| 久久精品五月| 色播丁香五月婷婷操:屄| 亚洲bt丁香五月天婷婷激情小说| 9l视频自拍九色9l视频自拍九色9l社区| 人人操av| 久久婷视频| 五月熟妇婷婷久久| 色色五月天丁香| 欧美三级巜人妻互换| 日韩成人电影Av| 国产精品久久99| 天堂草在线看www| 五月婷婷中文| www.精品久9| www色婷婷久久综合久色| 狠狠干综合网| 四LLL少妇BBBB槡BBBB| 亚洲无码黄色| 色欲资源网| 婷婷六月啪啪| 日本九九视频| 日本欧美国产| 激情五月综合网| 伦乱人妻| 中文字幕丁香五月| 另类激情中文| 99久热精品在线| 思思网站| 久久精彩视频| 九九精品热播| 五月丁香激情婷婷综合| 成人做爰A片免费看视频| 九一九九黄色| 日本九九网| 日韩小视频在线99| 色婷婷激情| 丁香婷婷综合激情五月色| 噜色精品| 久久五月丁香| 色色色777| 五月婷视频在线| 激情文学综合婷婷五月天丁香花| 色色精品色| 天天摸天天舔| 婷婷欠久少妇| 婷婷五月天激情小说网站| 五月婷婷啪啪啪| 九一牛视频探花| 91精品国产综合久久密臀| 国产午夜一区二区三区| 另类视频一区| 亚洲成人网在线观看| 爱狠射| 婷婷五月天偷拍| 国内外色色色色色成人视频| 久久综合九九| 丁香五月av| 欧美精品99| 婷婷激情五月天激情小说| 深爱激情AV| 色色色综合色| 婷婷情色五月天| 天天干天天干天天操| 日本三级99人妇网站| 99热这里只有精品2016| 国产成人精品亚洲线观看| 99人人操人人操人人精| 神马欧美精| 99ri精品在线| 五月天婷婷操逼视频| 成人AV网站在线| 亚洲色五月婷婷| 中文字幕久久婷九女同| 国产午夜一区二区三区| 欧美激情中文字幕| 色综合天堂| 久9热视频在线观看| 婷婷五月AV| 色五月婷婷操逼| 色五月婷婷久久| 久9热| 色五月激情| 五月丁香拍拍激情综合| 国产性爱在线| 四色AVwww| 久久99精品久久久久久三级| 五月丁香999| 99热这里只有精品98| 人妻丰满精品一区二区A片| 这里只有精品视频国产| 婷婷丁香六月天激情四射网| 色五月婷婷九月| 99精品97| 欧美搡BBBBB摔BBBBB| 狠狠干五月丁香| 天天久久婷婷| 久久9热| 色噜噜狠狠色综合成人网| 99热精品无码| 日日做夜夜爱| 天天综合五月| 激情开心五月天| 狠狠狠五月婷婷六月丁香| 四色五月视频| 五月丁香六月婷| 色五月婷婷、老熟女| 超碰97色| www色五月| 激情五月婷婷综合网| 性色视频| 少妇高潮一区二区三区99欧美| 亚洲日本韩国| 久久这里只有精品8| 九九热这里只有精品7| 色婷婷小说| 欧美丁香婷婷五月天| 久99视频| 丁香九月色| 丁香婷婷激情五月天无毒不卡蜜桃| 日本在线视频播放91| 色色国产| 九九综合伊人| 色五月五月丁香| 欧美乱码国产一级A片| 99ER热精品视频| 青青草五月天| 五月婷婷欲色| 中文字幕成人| 丁香五月婷婷操逼| 丁香婷婷综合激情五月色| 一级操逼内射在线视频| 五月婷婷久久开心网| 婷婷伊人视婷婷婷| 99re6在线视频精品免费| 色九月婷婷丁香| oVV4WIB3vFi8D| 成人在线网址| 97人妻碰碰碰久久| 1024亚洲无码| 免费视频WWW在线观看网站| 99热这里只有精品9| 影音先锋 91工厂| 91丨九色丨白浆秘| 久久天堂女人| 久久看九九90| 五月天伊人| 久久99网站| 日韩视频99| 丁香五月婷婷精品视频| 99精品成人无码A片观看金桔| 天天摸天天舔| 久久久久久五月天| 欧美激情五月天在线观看| 欧美色宗和激情| 婷婷五月色情| 97成人在线视频| WWW嗯嗯啊啊啊啊| 色99视频| 色色性爱视频| 婷婷五月天综合在线| 激情综合一| 99爱在线精品视频免费观看| 五月婷婷激情四月| 99热99热| 天天草天天摸| 亚洲操B| 欧美综合激情丁香五月六月婷| 狠狠插狠狠| 俺去啦综合网| 久久免费视频62| 狠狠干伊人| 欧美成人精品一区二区 | WWW,五月| 无码动漫av| 区美毛片子| 天天干天天插| 亚洲一区二区无遮挡A片| 激情五月综合亚洲另类| 丁香六月婷婷色播| 婷婷色综合| 久婷五月| 超碰人人在线| 婷婷五月天AV| 国产欧美熟妇另类久久久 | 99男人天堂| 九九大香视频| 色~性~乱~伦~噜| 综合激情伊人影视在线| 九九蜜臀精品| 婷婷射图五月天| 激情五月婷婷色| 99热成人| AV在线中文| 99啪啪视频| 99综合网| 99热99精品在线观看| 亚洲九九婷婷| 九九色大香蕉| 丁香婷婷综合精品六月初| www.狠狠狠狠| 色J香五月天| 天天干天天拍| 色九月| 狠狠干.com| 先锋资源91| 99热国产精品| 五月天婷婷永久免费视频| 久久九九在线视频| 激情婷婷五月基地| 色区久久| 国产成人AV不卡| 91人人操| 激情五月天婷婷久久久久久久久久久 | 久久激情综合| 激情婷婷黄色五月| 婷婷五月激情综合| 久久99热精品a片在线观看| 久久综合首页| 538在线精品| 九热久| 久久老码第一| 五月 成人 婷婷| 99只有精品| 五月婷A V在线| 欧美激情中文字幕| 婷婷丁香高潮了| 成人精品人妻| av免费在线看不卡无毒| 九九色影视| 五月丁香激情在线| 五月天精品| αV电影| 这里都是精品99| 婷婷五月激情小说| 亚洲乱码日产精品BD在线观看| 色欧美影院| 伊人干练久| 久久久久er热| 成人 九九九九| 青青草Avb在线| 五月丁香在线精品| 丁香五月婷婷影院| 日韩精品一品二区三区的使用体验| 草美女在线观看视频在线播放| 国精产品一区一区三区有限公司杨 | 五月婷婷综合在线亚洲视频| 日本人妻A片成人免费看片| 欧美丁香婷婷五月天| 97色色色| h亚洲| 天天艹夜夜艹| 色综色网| 九九热手机在线视频| 久99热| 色婷婷狠| 五月婷婷丁香婷婷| 性爱五月婷| 5月婷婷激情6月| 99热官网| 色五月婷婷婷婷婷婷婷婷婷婷| 婷婷成人丁香色情基地30| 婷婷激情五月| 国产欧美日韩性爱| 婷婷丁香色五月| 中文字幕欧美久久| 啪色综合| 久久99三级在线视频| 色狠狠综合入口| 影音先锋美国A| 婷婷丁香五月天色区| 五月丁香六月婷婷网| 天天爽人人综合免费7799| 亚洲另类视频| www.com在线操视频免费观看| 日韩综合大黄| 1024亚洲无码| 人妻精品久久久久久久| 91色呦哟| 日日爽日日爽| 色开心五月婷婷丁香HD| 色色色色色综合| 大香久久综合网| 欧美日韩一区二区三区四区| 欧美在线ee日韩| 婷婷播5月| av在线不卡播放| sewuyue第四色| www...com黄在线观看| 99在线视频在线观看| 韩国中文字幕91| 色五月婷婷天天操夜夜操| 97碰精品| 五月婷婷婷| 8区视频在线| 碰碰91| 天天插综合在线| 极品人妻VIDEOSSS人妻| 一本久久亚洲五月婷婷| 伊人激情综合| 五月天婷久精视频| 欧美99热| 99热官网| 亚洲第一第二网站| 99热插| 亚洲综合五月天婷婷| 国产欧美婷婷| 久热精品免费视频4| 五月天伊人综合| 色碰干| a在线观看| 婷婷五月天资源| 丁香五月激情月| 天天插天天爽| 欧美Va在线| 狠狠爱婷婷丁香| 五月丁香777| 天天色综合综合| 中文字幕成人影视| 丁香五月偷拍| av中文网站| 欧美日韩99| 一本色道久久88综合日韩精品| 777.色色| 嫩草视频观看| 蜜桃人妻无码AV天堂三区| 激情q青青草在线婷婷| 久久久久久久11111111111| 五月天激情婷婷| 色色网站免费在线视频| 亚洲啪啪精品| 熟女激情五月天| 开心五月深爱婷婷| 婷婷伊人中文字幕| 色播激情婷婷| www.色婷婷| 久久久精品人妻录| 妇激情基地| 中文成人在线| 激情五月久久| 色五月成人| 人人亚洲| 99riAv1国产在线观看| 欧美大片| 久久机热/这里只有精品| Va另类视频| 五月丁香啪啪啪| 玖玖婷婷五月天毛片| 五月丁香综合| 五月丁香婷婷爱| 天天干天天爽天天爽| YJLZZJLZZ亚洲乱熟无码| 玖玖伊人网| 五月丁香啪啪网| 97色片| 激情六月日韩| 色婷婷丁香中文在线播放| 91热在线| 神马欧美精| 偷拍丁香九月激情| 婷色五月| 日本啪啪网| 五月综合婷婷五月| 天天日日天天| 人妻熟妇国产精品| 91人碰| 九九99精品视品| 久久精品国产一区二区三区四区| 久久久五月五丁香| 夜夜干天天操| 六月丁香五月激情婷婷| 婷婷丁香五月激情中文字幕版| 草一草avb| 九九人人看| 婷婷五月丁香性爱| 97碰碰草| 熟女人妻视频| 久久人妻少妇嫩草AV| 直接看的AV| 五月天激情亚洲| 日本久久精品18| 五月天激情国产综合婷婷婷| 深爱1激情网| 丁香婷婷成人在线播放| 激情四射五月天| 激情五月天色色网| 久久婷婷综合色丁香| 九九热99精品| 97成人在线视频精品| 色婷婷狠狠禁久久| 伊人丁香五月婷婷潮吹| 99九九这里有免费视频| 日本久久激情| 婷婷丁香综合网| 久久精品熟女亚洲AV麻豆| 夫妇交换刺激做爰| 天天色天天操天天射| 丁香六月婷婷久久综合| 色色色综合视频| 超碰在线看| 色激情综合狠狠婷婷| 婷婷五月激情的图片| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 激情婷婷九月| 人人澡玖玖一| 五月婷婷久久久| 国产精品久久99| 国产亚洲色婷婷99精品| 初夜av| 五月第四色| 色色射| 97九色| 日日干天天爽| 亚洲深喉AV| 在线视频九色97| 99人人精品| 99干日本| 五月丁香成人日| 五月丁香亚洲五月| 开心激情五月天网| 久久3p| 欧美成人A片AAA片在线播放| 五月婷婷偷拍| 国产真人做爰视频免费| 久9热插入| 色色综合激情| 色噜噜伊人| 婷婷日日天天| xxxx久| 色婷婷色99国产综合精品| 五月久久丁香| 婷婷综合在线播放| 激情小说五月丁香在线视频观看视频| 人人爱天天摸摸天天爱| 色婷婷久久综合久色综| 色婷五月天| 搡BBBB搡BBB搡五十| 色噜噜五月丁香婷婷| 五月婷婷丁香综合| 天天夜天天色天天| 欧美影院| 在线理论片| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 亚州欧美国产久精国产99综合视频| 婷婷色五月色妇| 五月色导航| 99在线免费视频| 香蕉AV777XXX色综合一区| 色五月激情综合网站| 婷婷伊人綜合中文字幕| 玖操97| 超碰久热| 丁香亚洲色综合| 丁香六月狠狠| 色五月婷婷影院| 久久婷五月天| 色色色在线观看| 欧美天天干五月丁香| 婷婷丁香亚洲色综合91| 久久婷婷五月天| 91avse| 五月婷婷自拍视频| 激情五月天色播| 99在线爽| 新五月天婷婷激情电影| 丁香六月婷婷色XXXXX| 九一娱乐在线观看视频| 伊人五月天在线| 丰滿爆乳一区二区三区| 五月天天丁香婷婷在线中| 天天摸色吧天天摸色吧| 99精品偷自拍| 日本3级片偷拍网站| 天天综合中文| 97色精品视频 | 亚洲激情丁香五月基地| 91色综合网| 九九热99久久99| 丁香五月婷婷久久久| 另类激情首页| 热婷婷av| 五月婷婷综合激情| 激情五月天影院| 色九九九九| AAAA网站| 日本熟女啪啪| 婷婷五月天影视| 五月婷婷综合激情| 激情床戏| 综合激情在线视频| 爱狠射| 深情五月天| 婷婷五月丁香99| 五月丁香六月婷婷中文版| 激情五月色婷婷| 国产成人在线不卡AV| 婷婷操婷婷干婷婷射| 日韩无码AV电影网站| 婷婷色香六月综合激情| 99热超碰在线| 亚洲Va成人| 婷婷五月色播放| 91avse| www.超碰在线| 91九色精品| 玖玖爱综合网| 婷婷人人操| 可以看的av| 超级碰碰91| 日亚二欧美| 国产av影片| 婷婷开心久久| 黄色av高清| 思思 热 99| 五月天激情亚洲| 五月停停激情网| 婷婷五月丁香成人网| 在线1青婷| 影音先锋91资源站| 丁香五月成人网| 久久精品系列| 五月婷婷啪啪啪| 欧美操人| A片试看120分钟做受视频红杏 | 激情五月婷婷综合色播小说| 成人丁香五月天| 五月婷婷开心爱| 99在线视频操999| 99精品在线下载| 丁香五月婷婷激情中文| 这里只有精品1| 超碰二区| 日本色婷婷| 婷婷五月天伦理| 国av网| 丁香六月激情国产| 99日本在线| 五月花婷婷| 久久深爱激情网| 六月婷基地| 超碰色综合| 色五月婷婷五月丁香五月激情五月视频| 202丰满熟女妇大| 欧美日本一区二区三区| 人人操 色| 色婷婷久久| 婷婷狠狠五月综合| 久久99精品久久久久久三级| 99热老司机| 色婷婷综合五月| 91久久久久| 日本久久高清| 69er小视频| 99啪在线| 天天干天天干天天干| 天天天天天天天操| 婷婷色偷拍| 欧美日韩欧美| 五月丁香婷婷综合| 成片免费观看视频大全| 大香蕉AV电影在线| 精品色色| 密乳视频| 99热老网站| 欧美日本韩国亚洲| 91疯狂操操操操| 六月丁香网| 可似看的AV| 六月丁香视频网站| 9色天堂| 婷婷五月色播| 亚洲激情五月天| 99re热精品视频国| 99热 在线播放| 久久曰曰| 一级二级色大片| 大伊久久| 中美月韩免费A片| 99色嘟嘟精品网站| 五月丁香啪啪网| 五月丁香在线看| 成人小说 五月天 婷婷| 高清国产AV| 99热10在线高清播放| 婷婷五月天亚洲| 婷婷色色欧美| 人人添人人| 久碰视频| 久久九⑨| av操B网站| 色五月婷婷五月| 色五月婷婷91| 亚洲综合激情五月| 综合综合色色| 五月丁香婷婷色色| 99热色综合| www.yw尤物| 99精品在线播放| 成人色五婷婷| 婷婷五月婷婷五月天| 六月欧美综合色情| 99热丁香| 五月丁香A∨在线| 日韩精品AV一区二区三区| 色婷婷丁香| 婷婷综合视频| 99视频只有这里精品| 这里只有精品视频看看| 香蕉婷婷| 久久久91| 婷婷五月激情图片| 9久热在线精品| 亚洲av电影在线| 在线视频区| 五月天婷婷色| 99热国产免费| 婷婷五月天堂| 激情婷婷久久| 香焦网五月天| 思思热高清在线观看| 天天插天天草人人玩| 天天日天天干天天爱| 丁香五月激情啪| AV成人在线播放| 欧美性猛交99久久久99| 超碰永久在线| 色婷婷色丁香色欲av| 91在线资源| 婷婷D区| 99热传媒| 特黄三级又爽又粗又大| 一本色道久久综合狠狠躁一二三| 亚洲网在线观看| 色色色九九九五月婷婷| 亚洲电影在线观看| 日曰躁夜夜躁2026| 欧美日韩婷婷五月天| 亚洲欧洲另类图片| aaaa久久| 99re思思热久久| 婷婷五月激情中文字幕| 99久久婷婷| 天天干天天拍| 狠狠婷婷综合| 久久婷婷五| 国产第99页| 激情婷婷在线中文字幕| 六月丁香啪啪| 久久综合激情五月天| 欧美激情xxxXX| 99热久草| 夜夜躁爽日| 色偷偷色婷婷| 婷婷激情六月| 99网| 久久婷婷五月综合网| www.久久爱.c n| 五月丁香色婷婷色| 久久精彩综合视频| 五月天色导航| 免费视频这里只有精品| 色婷婷丁香五月| www.minyis.com【JT】实力收量可预付QQ2101460746 | 激情五月婷婷在线区| 99热在线观看免费| 色在线99| 大香蕉九九| 国产熟妇乱子伦hd| 亚洲色色五月| 91vip在线观看| 婷婷丁香五月天欧美| 思思热久热| 26uuu精品国产| 色五月婷婷久久| 婷婷色五月91啪啪| 黑人熟妇一区二区三区| 99在线精品观看99| 99爱精品视频| 婷婷的久久网站| 99综合免费视频| 丁香婷婷午夜| 九九人妻福利| 淫荡综合网| 日韩999| www.91热久久| 婷婷五月色影视先锋| 久久这里在精品视频| 丁香五月天论坛| 欧美日韩成人| 51精品国内探花| 欧美群妇大交乱婬网| 五月丁香婷婷爱激情综合网| 五月天 另类图片| 激情丁香婷婷六月天| 天天干天天日天天操| 天天婬色综合| www.9操| 婷婷六月综合| 26uuu欧美亚洲日韩| 啊V视频在线观看| 日本人妻伦在线中文字幕| 久久久精品AV| www,av好吊操| 五月婷婷激情久久| 婷婷五月综合网激情| 色A网| 五月天婷婷AV| 亚洲天堂婷婷| site:wpjngj.com| 久久婷婷在线| 亚洲黄色影视| 9久热在线精品| 另类图片 五月激情| 久久婷婷婷| 久热天堂| 亚洲久久婷婷丁香五月天| 色婷婷a v| 在线观看欧美3区| 夜夜www| 国产无套精品一区二区| 丁香五月伊人| 欧洲亚洲最新精品| 91人人爽狠狠狠| 亚洲天堂婷婷| 婷婷激情蜜桃玖玖丁香| 久久99网| 99久久国产综合精品五月天喷水\| 婷五月丁香俺| 丁香五月欧美成人| 五月 激情视频| 色噜噜狠狠狠综合曰曰曰| 福利视频在线播放| 久热视频A.| 性色婷婷| 久一网站| 久久天天| 91AV视频| 五月丁香啪啪综合网| 成人片黄网站色大片免费毛片| 丁香婷婷精品视频| www.婷婷五月天| www.综合久久.com| 久久这里只精品| 九九色天堂| 天天操天天日天天操| 五月天天丁香婷婷| 色婷婷丁香五月天激情综合网| 99久热| 国产色色在线| 天天日天天插| 青草性爱视频| 99免费在线| 深爱激情中文五月天av| 丁香五月偷拍| 开心婷婷五月激情网小说| 五月天大香蕉| 丁香婷婷人妻| 五月激情影院| 色99视频| 九九久久网| 79亚洲精品少妇| 日韩av一区二区在线/日产精品久久久| 亚洲熟女色| 久久婷婷六月综合|