欧美成人午夜精品久久久,国产?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
返回資訊列表
色婷婷激情| 激情五月图| 欧美久久网| 另类天堂| 黄色AAAAA| 超碰在线观看9| 五月婷婷五月天激情网| 激情宗合哪里能看| 日韩淑女人妻luan伦激情精品一区二| 少妇人妻偷人精品无码视频新浪| 99ri精品在线| 麻豆五月丁香婷婷| 亚洲激情另类| 激情四射婷婷| 欧美激情VA永久在线播放| 六月激情网| 激情综合五月婷婷六月丁香| 五月天色丁香| 丁香婷婷色色| 激情五月天婷婷| 中文字幕人妻AV| 婷婷.com| 亚洲乱码日产精品BD| 久这里只有精品| 丁香花五月天激情| 天天做天天爱天天日| 日韩av在线电影| 99婷婷五月天激情| www.五月天婷婷| 色婷婷香蕉在线| 五月天第四色开心色播| 婷婷激情四射| 久久婷婷成人视频| 五月婷婷啪啪| 色小说五月天| 亚洲另类AV| 第六色在线| 久久久18| 六月婷伊人| 免费看欧美成人A片无码| 欧美va亚洲va| 中文字幕婷婷9月天| 丁香桃色综合网| 欧美色综合天天久久综合精品| 99视频色在线观看| 国产毛片精品一区二区色欲黄A片| 婷婷97狠狠干| 超碰操日| 性爱网五月天| 人人爱天天摸摸天天爱| 色原狠狠综合| 激情久久久| 这里只有精品在线播放| 激情婷婷六月天| 在线观看亚洲AV| 丁香五月激情网| 婷婷丁香成人五月天| 一级二级色大片| 亚洲国产精品成人免费一区久久久在线观看AAAA | 久久色天堂| 99在线精品观看99| 在线天堂9| 国产成人精品123区免费视频| 欧美精品啪啪| 亭亭玉月丁香| 俺去也五月天婷婷| 韩国情人在线电视剧免费观看高清版全集 | 日日噜狠狠色| 99热这里只有精品国产免费| 激情婷婷22月间| 色综合色五月| 国产午夜成人AV在线播放| 五月天激情四射网站| 五月人人丁香婷婷五月人人丁香| 五月天丁香啪啪综合| 91精产一区三区免费观看| 9色免费网| 久草天堂| 99热碰碰热| 99小视频网站| 丁香五月AV综合激情| 99,色| 欧美在线视频9| 狠狠操狠狠爱| 色欲资源网| 婷婷丁香五月天亚洲| caopeng97日韩| 五月激情网综合| 色婷婷五月天激情在线观看| 狠狠色婷婷综合开心影视| www.五月丁香| 99热这里都是精品| www.爱婷婷.com| 亚洲色图81p| 婷婷天堂综合| 粉嫩av蜜桃av蜜臀av| 1024在线视频| 色五月丁香五月激情五月激情| 五月综合亚洲婷婷| 内射激情在线| 老司机伊人| 99热在线观看| 少妇AB又爽又紧无码网站| 色色色综合网| 婷婷激情六月| 人人摸人人| 啪啪啪大香蕉| 人人干99| 国产免费一区二区在线A片视频| 婷婷五月激情丁香| 无码碰碰| 久99精品视频| 欧美性丁香色色五月天| 婷婷四色五月| 国产67194| 99热热热国产超碰| 亚洲最大在线| 操九色| 婷婷五月天 丁香五月天 裸体| 亚洲三级无码| 色色网站在线免费观看视频| 婷婷五月天无码熟女| 激情五月天小说视频| 天天天天色天天天天天干| 婷婷丁香五月亚洲| 丁香婷婷五月激情| 久99久在线观看| 欧美精品18| 4399无码视频二区| 精品二区| 青青草原爱爱网| 99色色最新视频| 久久这里都是精品| 久久艹网| 亚洲中文无码成人| 六月丁香六月婷婷欧美| 亚洲Av成人在线观看| 久久99综合| 丁香大香蕉| 久久se 综合网 | 狠狠婷婷爱| 五月天婷婷在线播放| 丁香八月综合激情| 婷婷丁香69精华| 五月丁香六月激情欧美综合| 色六月天天激情综合网| 超碰日韩人妻在线| 色99网站| 99国产97在线,| 直接看的AV| 香蕉久久国产av一区二区| www.五月天婷婷姐姐| av大片在线| 狠狠香婷婷五月| 亚洲人妻av伦理| 四色 爱 婷婷 精品 亚洲 五月天| 激情噜噜噜| 色色网站免费在线视频| 91婷婷五月天综合视频| 天天爽天天爽夜夜爽| 97婷婷五月| AV在线中文| 亚洲网视屏| 99热这里是精品| 久久久婷丁香五月| 在线不卡的视频| 色日本综合| 思思热闹这里只有精品| 久碰综合| 久久综合人妻| 久久婷婷五月综合色天| 色色9 9| 婷婷色导航| 丁香五月六月综合激情| 色婷婷欧美| 爱操人妻| 久草大| 欧美毛片www| 99久久婷婷| tingtingzonghewang| 操97在线观看| 久久婷婷五月天激情| 神马欧美精| 色综合色综合色综合| 98热精品| 亚洲久久激情| 91无码一区人妻A片蜜| 欧美25p| 五月 丁香 欧美| 激情综合丁香| 99综合97| 9有码中文| 色婷婷丁香五月综合| 色婷婷婷av| 久99热在线观看| 丁香五月婷婷操逼| 丁香香蕉射射射| 99热久| 99热在线看片| 开心五月丁香综合久久| 色天使久久综合| 香蕉久久国产AV一区二区| 五月天婷婷色色| 色综合久久天天综合网 | 香蕉97碰碰碰欧美| 99热在线观看| 庭庭久久内射| 九九99在线免费在线观看视频| 色色日本| 欧美激情丁香五月天久久婷婷一区| 三级黄色大片视频| 九九精品丁香花| 超碰色热| 六月激情婷婷| 欧美性生交XXXXX无码小说| 99热9| 欧美槡BBBB槡BBB少妇| 色玖玖玖| 丁香六月| 热中文字幕| 色五月天天在线观看资源站| 美女婷婷六月色| 五月丁香婷草| 久久五月天激情婷婷| 91网站黄| 天天搽天天射| 99人人干| 婷婷六月天亚州| 天天天天天久久久久久| 色婷婷六月| 婷婷丁香在线播放| 欧美va视频不用播放器的va视频网| 婷婷爱五月| 五月丁香综合啪啪| 五月丁香六月欧美| 情五月亚洲婷婷| 婷婷五月天另类网站| 五月婷综合| 天天射色五月天| www.99热在线观看| 草草夜夜操| 久久99热这里只频精品6学生| 九色PORNY自拍成人精彩视频| 中文字幕综合| 丁香五月天AV在线| 色婷婷丁香花五月天| 婷婷六月色情| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 人操综合| www.色色com| XX久久| 日日操夜夜操狠狠操| 婷婷丁香人妻久久在线观看| 中文字幕成人影视| 丁香五月av| 婷婷五月丁香综合桃花色网| 欧美色图天堂网| 思思re视频在线| 久久92| 综合色色五月| 激情五月综合| 丁香六月激情网C0W| 五月丁香婷婷基地| 婷婷五月天av小说| WWW五月婷婷| 深爱激情综合| 粉嫩AV久久一区二区三区| 情一色一乱一伦一91A| 久久er+| 日韩综合久| 毛片九九九九九九九九18| 深夜男女福利刺激影院一区| 99热精品在线播放| 国产婷婷婷| 丁香九月综合| 综合网色| 亚洲无线视频| 婷婷操超碰| 五月婷婷 自拍| 丁香五月天人体| 色五月超碰| 天堂网亚洲色图| 91人妻视频| 九九色色| 五月天婷婷三级黄| 99热在线观看免费精品| 中文无码婷婷| 六月丁香啪啪啪| 久久久久久久久99精品| 成人无码精品1区2区3区免费看| 国产亚洲精品久久久久久郑州| 99久在线精品| 亚洲综合激情五月久久| 美女丁香五月天| 六月丁香啪啪| 丁香五月天偷拍| 九九热这里只有精品6| www.91久久| 丁香五月天啪啪| 五月天激情四射| 激情六月婷婷| 亚洲五月天色| 日本欧美成人片AAAA | 五月婷婷六月丁香玖玖玫瑰91| 99精品综合在线| 天天摸色吧天天摸色吧| 伊人久热91网| 99热综合在线| 99热精品网| 熟妇国产| 久久狠狠干| 天天激情视频| 奇米影视在线视频| 久婷久婷| 日韩 中文 欧美| 婷婷五月天情色| 天天综合五月| 五月丁香婷婷啪啪| 狠狠色噜噜狠狠色噜噜噜999| 久色资源| 欧美操我| 99爽视频| 天天色天天搡| 在线综合网| 亚洲视频a| 狠狠综合| 麻豆五月丁香婷婷| 深爱激情五月网| 免费无码毛片一区二区A片 | 天天综合 99久久婷婷| 日韩五月婷婷| A一级操| 久久HD| 六月狠狠综合| 久热91| 1769在线观看欧美国产| 国产精品大香蕉| 热99热9| 亚洲激情AV| 俺去也综合| 久久总和99| 欧美群妇大交乱婬网| 婷婷在线午夜| 国产婷婷五月天| 91艹人| 国产99久| 91pornav在线| 99爱精品视频| 9九九久久精品无码专区| 色婷婷综合久久久久| 激情丁香五月天图片| 91chinese在线| 99这里有精品免费| 日本视频99| 激情五月天色色| 五月婷网| 九色自拍| 亚洲热热视频| 99大香蕉| 七七色色综合| 久久婷婷色| 久热中文字幕| 色就是色婷婷五月亚洲激情| 国产全是老熟女太爽了| 五月婷综合性中心| 3p九色在线| 五月激情网络| 亚洲色基地| 丁香五月综合在线观看| 思思re99视频在线观看| 影音先锋 一区| 思思热在线视频99| 农村熟妇高潮精品A片| 香蕉狠狠爱视频| site:feetmall.com| 色久女| 久久五月天丁香| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 婷婷五月花丁香| 亚洲午夜AV| 久久综合播放| 五月婷婷中文字幕| 综合亚洲AV| 91美女被操| 丁香婷婷人妻| 久久久精品婷婷五月天| 日韩AV在线电影| 97av在线视频| 五月丁香成人网| 激情五月天99色| 久久这里有精品视频在线免费观看| 激情综合久久| 久99久99精品免| 超碰猛烈的性猛交| 国产精产国品一二三在观看| 五月婷婷九九热| 99热网站| 黄色短视频在线观看| 五月色婷婷影院| 99热6这里之有精品| 三日本无码| 亚洲AV网站| 久久66精品| 丁香五月天狠狠操| 久草热8精品视频在线观看| 五月丁香在线综合| 思思久ren热| 激情碰碰碰| 99久久6| 天天日天天日天天搞| 久热超碰91| 亚洲无AV在线中文字幕| 黄色片久久| 亚洲区,视频区,视频区免费| 99精品视频在线观看| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 婷婷综合av| 丁香色婷婷五月天| 五月婷婷天堂| 久热9| 深爱五月天婷综合| 欧美综合激情丁香五月六月婷| 原琪琪色影院| 九九热99精品| 综合色色五月| 另类小说五月天综合网| 五月色婷婷夜色| 99热在线播放| 丁香婷最新动态| 另类小说五月天| 午夜婷婷久久| 四色女婷婷| 久久99免费视屏| 9九色首页| 九色成人AV在线| 六月丁香网| 五月丁香久久综合| 五月天激情四射网站| 亚洲色综合性| 亚洲va欧美va国产综合久久久| 深爱五月月天| 丁香花色色网| 黄网免费看| 色婷婷综合电影| 婷婷视频在线碰| 婷婷丁香日韩五月| 五月激情网综合| A1片久久久| 九色婷婷| 亚洲另类日本| 99在线观看视频精品| 成人精品免费在线观看| 五月天激情四射| 色播五月丁香综合| 999精品乱码77777| 国产黄色在线观看| 性视频久久| www.99热最新视频8| 色啪久 | 婷婷五月激情丁香| cc精品国产性传播| 丁香五月婷婷六月婷婷| 五月婷成人网| 丁香丁婷五月激情| 欧亚洲在线高清视频| 五月激情综合网| 精品视频网| 玖玖色综合| 99色色| 日韩av在线电影| 无码人妻激情| 五月婷婷色播| 婷婷色色网站| 99九九热视频免费| 国产亚洲在线| 五月天色综合服务平台| 婷婷五月美女直播| 99男人的天堂| 成片免费观看视频大全| 超碰99热精品在线| 国产.亚洲.欧洲视频在线| 噜噜噜狠狠色综| 婷婷激情小说网| 亚洲色色图片| 激情五月色在线播放| 亚洲天天操| www.日日夜夜.com| 天天爽天天摸| 最新五月天婷婷影| 婷婷欧美激情综合| 婷婷综合色图| 色五月97| 亚洲韩国日产综合AV| 97在线视频观看| 玖玖在线视| 亚城区在线| 天天干狠狠操| 99亚洲综合| 五月婷婷av| 九九热婷婷| 久久五月婷综合| 九九av| 五月激情视频| 棕合影院色色| 色九九九九| 99热久草| 91啪啪| 人妻系列久久久久久久久久久| 丁香六月激情国产| 免费色婷婷| 婷婷色五月丁香六月欧美啪| 天天色情站| 色色六月| 五月丁香综合啪啪啪啪啪| 久久久久久久久久人妻| 丰满人妻一区二区三区| 好色婷婷| 99思思热只有在这里看| 26uuu日韩| 五月天堂六月丁香亚州中文字幕久久| 99热 在线观看| 婷婷五月天天爽| 极品人妻VIDEOSSS人妻| 97碰碰视频在线观看| www开心激情网| 日韩婷婷| 亚洲婷婷久久综合| 婷婷六月情| 国产亚洲精品久久久久久豆腐| 欧洲电影在线观看免费版英语版| 五月婷激情| 99这里只有| 26uuu精品一区二区| 五月婷婷色色| 日日夜夜天天| 欧美特大片黄| 五月天婷婷网站| 超级碰 久久9| 婷婷伊人75| 国产老熟妇亲子乱对白| 开心五月六月婷婷| 99er6| 色五月av伊人| 午夜激情五月| 天天在线XXX| 神马欧美精| 五月停亭六月,六月停亭的英语| 丁香五月婷久久| www久久99| 色久在| 高清无码入口| 99综合熟女| 五月婷婷婷婷| 99色综合久久| 天天日夜夜欢| 国产婷婷综合| 4399无码视频| 婷婷综合网站| www.婷婷五月.com| 日韩视频99| 国产亚洲成人综合| 夜夜干夜夜操| 亚洲综合另类| 五月婷婷色色网址| 色五月欧美| 免费AV在线| 久久丁香五月| 人妻AV在线| 4399成人黄A片| 中文字幕在线免费观看视频| 日本人妻伦在线中文字幕| 中文字幕成人日韩| 大香蕉久久伊人婷婷五月丁香| 亚洲激情电影五月天色婷婷丁香一起草 | 97干在线| 色婷婷丁香五月综合| 1区2区视频| 免费黄色片子| 日韩成人电影Av| 操操碰| 久噜久噜| 九月激情网| ..真实国产乱子伦毛片| 91人人网| 99re这里只有精品在线观看| 久久婷婷六月综合| 人人综合色| 亚洲操操| 99热综合| 丁香六月婷婷综合网| 99热网精品| 无码人妻一区二区一牛影视| 丁香婷婷六月激情文学 | 久久99免费视频网站| 免费视频99| 九九色综合网| 超碰狠狠干99| 丁香五月天社区| 五月婷丁香| 亚洲国产精品VA在线看黑人| 噜噜视频| 五月六月丁香婷婷在线观看| 久久婷婷五| 久久婷五月天| 夜夜操天天爽| 我爱大香蕉| 国产精产国品一二三在观看| 日本九九网| 五月天无码视屏播放| 成人在线免费网址| 久/久精品99看9| 97成人丁香| 风流少妇A片一区二区蜜桃| 九九青草热| 五月婷婷欲色| 色婷五月天| 欧美丁香五月97色| 亚洲色99| 日操夜操天天操不卡| 丁香六月 婷婷六月| 99九九视频精彩在线| 任你干aa| 国产精品色色色色| 色婷婷影视| 亚洲激情av| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 久久一热| 色域五月丁香| 丁香婷婷啪啪啪| 日本人妻A片成人免费看片| 人人九色| 91精品婷婷国产综合| 久久九九免费视频| 五月天狠狠色| 79色色色色| 99热精品免费| 久热视频A.| 日韩无码专区| 成片免费观看视频大全| 天天肏视频| 超碰无码318604| 99热免费在线| 五月婷婷,六月婷婷| 五月丁香啪啪综合| 人妻中文字幕精品| 真实亲子乱子伦高清在线观看| 日本波多野结衣视频| 婷婷色丁香五月| 99超超碰| 五月丁香六月合| 美国少妇性做爰| 手机AVAV天堂看网| 综合久久十三| 亚洲另类噜噜| 激情丁香五月AV| 亚洲操B| 婷婷色片| 女婷久久| 天天草人人摸| 99情色五月天| 久久久九九九 99| 激情综合五月天| 91碰碰视频| 日本久久天堂| 天天干夜夜操A片| 五月丁香影院| av网站中文| 五月丁香天堂| 九九精品综合| 色五月婷婷五月丁香五月激情五月视频| 午夜一区| 欧美婷婷五月天综合| 亚州第一黄网| 国产激情在线| 久久人妻久久久久| 亚洲日韩成人三级av| 婷婷五点亚洲| 婷婷综合97| 亚洲情欲| 婷婷深爱五月丁香网| 一本九九色| 情色五月天网站| 色九月| 三级黄色大片视频| 五月天色区| 婷婷伊人| 日本91在线播放| 精品香蕉99久久久久网站| 开心五月婷婷激情| 久久综合五月天激情小说网站 | 骚。com| 97人人做| 色狠狠色噜噜AV天堂五区| 婷婷五月花丁香| 99在线热| 97综合视频在线| 欧美视频五区| 另类国产综合| 婷婷五月综激情| 超碰v| 狠狠色噜噜狠狠狠888| 天天插天天狠| 激情五月天福利| 九九精品热| 深爱五月最新网址| 人妻AV在线| 26uuu成人网| 亚洲中文字幕AV| 婷婷五月噜噜| 婷婷开心深爱五月天| OYIWbGcPu8H| 岛国AV网| 五月亭亭直播| 色 丁香婷婷| 六月丁香中文字幕| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 精品婷婷| 丁香婷婷五月综合欧美另类| 激情五月婷婷五月| 色五月婷婷小说亚洲中文字幕组| 久久亚洲婷婷综合色五月| 午夜丁香 婷婷| A片试看120分钟做受视频红杏| www.狠狠| 97五月天婷婷| 日日操夜夜操狠狠操| 丁香五月婷婷Av| 五月综合激情啪啪啪啪啪| 色九九综合| www.国产色| 一本道综合网| 五月丁香美女视频| 婷婷丁香五月91| 久久婷婷一级片| 激情开心五月天| 久久综合干| www.婷婷五月| 婷婷五月天免费视频在线观看| 久久久色婷婷五月天| 日韩精品超碰在线观看| 色婷婷人人| 婷婷五月开心中文字幕在线| 五月天另类激情在线| 欧州婷婷五月天综合| 思思精品久久艹| 中文精品在| 伊人狠狠色婷婷综合丁香一区| 97搞在线| 色色五月婷婷狠狠| 日韩丰满少妇无码内射| 99久久综合网| www.minyis.com【JT】实力收量可预付QQ2101460746 | 日本一级特黄大片AAAAA级| 最新日韩久热免费视频看看| 婷婷五月天av| 色婷婷操逼| 五月天综合图片| 另类图片 五月激情| 五月丁小婷婷激情四射| 999激情视频| 色婷婷五月天不卡| 久久99人人| 另类综合激情| 最近中文字幕大全免费版在线| 色欲九区| 大香蕉五月婷婷| 五月婷婷影视| 五月激情基地| 啪啪啪五月天| 操操操操操电影网| 激情婷婷丁香色五月综合| 丁香五月天激情婷婷丁香六月| 久久人操| 久久视网36| 丁香五月天网站| 婷婷综合五月天| 第五婷婷伊人丁香色| 91ncm视频| 激情文学第四色婷婷丁香五月| 丁香 亚洲 久久| 色开心五月丁香| 婷婷五月中文字幕| 婷婷久久图片| 色婷婷9| 五月丁香婷婷婷激情爱爱| 天天综合久久| 九九大香视频| 丁香五月性爱| 亚洲人人96@| 天天草天天爱| 天天操天天日天天爽| 五月丁香网站在线播放| 久久机只有这里精品| 五月丁综合在线观看| 先锋av性爱成人电影| 天天檫天天爽| 99热首页| 成人综合视频在线| 99re99在线看| 久久久ww| 91精品电影18T| 九九综合九九| 97碰| 五月丁香综合激情| 深夜婷婷 丁香| 中文字幕在线免费看线人| AA片在线观看视频在线播放| 人人操婷婷| 欧美色碰| 99热这里只有精品26| 色五月丁香总合网| www.ppypp| 丁香六月婷婷综合缴| 五月天综合激情网| 丁香婷婷激情| 91呦呦呦| 婷婷网影院| 另类色视频| 欧美色色色色色色色| 超碰国产在线观看| www久久久| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 无码人妻一区| 91avse| 亚洲另类在线观看| 超爽内射| 91综合国免费久入| site:ornaments52.com| 久久久久人无码人妻| 狠狠干最新地址| 五月丁香成人| 久久人妻情侣| 久热伊人在91| 天堂综合久| 五婷婷六月合| 五月激情婷婷国产精品久久久久久 | 天天干夜夜谢| 99热最新网址| 激情五月天婷婷丁香| 日本三级中国三级99人妇网站| 婷激情五月| 中文字幕AV网址| www.97视频| 铁牛TV人妻| 激情婷婷狠狠干| 五月天激情四射网站| 国产精品久久久久久久久久| 在线91日韩| 五月婷婷开心色伊人| 婷婷播5月| 99免费视频| 日本99婷婷| 九九熱最新視頻| 精品九九网| 色婷婷19| 色婷婷97| 国产日韩欧美| 热婷婷av| 中文av网| 欧美啪啪网| 202丰满熟女妇大| 久久婷婷综合网| 亚洲精品色色| 色综合久久五月| 自拍视频99| 亚洲成人网站在线| 91精品婷婷国产综合久久| 翔田千里 50岁 无码| 六月婷婷网| 天天狠狠色| 亚洲黄网在线| 五月丁香六月婷综合成人综合| 91丨九色丨大屁股| 丁香五月婷婷久久久| 99热这里只有精品22| 大香蕉婷婷五月天| 久9热在线视频| 色久九| 丁香五月婷婷网| 色五月婷婷视频| 丁香五月激情久久麻豆| 激情5月婷婷| 亚洲最大在线| 六月成人网| 色婷婷亚洲六月婷婷中文字幕| 99久久久久久久| 中文字幕永久免费| 性爱在线播放av| 丁香六月激情国产| 九月婷婷久久久| 激情精品久久| 久99久视频精选| 九九久久99| 狠狠色丁香乆乆| 超黄亚洲瑟瑟网站| 最近中文字幕大全免费版在线 | 五月丁香六月婷婷中文版| 久久久免费精彩视频| 啪啪操超碰| 久久a热| 色婷婷AV五月天| 成年人夜夜喷水| 丁香五月婷婷啪| 一区=区操屄高清大全av| 99热777| 99操逼| 91精品婷婷国产综合久久| 亚洲AV成人无码久久精品老人法拉利| 爱99干99| www.婷婷五月天| 天天爽天天摸天天爱| 超级碰碰一区| 色婷六月| 狠狠五月激情在线| 五月天婷婷激情| 天天做天天爱天天高潮| 开心五月色婷婷综合开心网| 丁香六月 婷婷六月| 99久久视频| 97人妻人人| 色婷婷五月天无码视频| 国产av一区二区三区| 国产无套精品一区二区| 伊人五月综合网| 欧美大道不卡| 婷婷五月天亚洲五码| 综合久久人妻| 婷婷精品综合| 夜夜撸夜夜骑| 91色吧网| 超碰色综合| 亚洲成人综合在线| 精品成人久久久久久久_一二三四视| 狠狠干在线| 婷婷五月天高清无码| 五月婷婷综合丁香视频| 激情五月天影院| 亚洲九九视频| 亚洲五月天婷婷| 五月天婷婷久久视频| 五月丁香综合| 超碰在线免费观看日韩| 日韩AV在线免费| BT综合在线视频观看| 综合色播| 99热资源在线| 婷婷五月花| 4399伦理午夜| 成功精品影院| 六月色播| 婷婷激情图片| 日本五月婷婷久久久六月丁香| 99热91| 第2色五月婷| 欧美肉大捧一进一出免费视频| 91人人操.COM| 久久婷婷五月综合啪| 丁香97综合| 91在线日| 日日综合网| 九月综合| 97操碰视频| 色五月天.con| 亚洲精品色| 久久99这里只有精品| 色婷婷综合视频| 婷婷五月激情网| 91干在线| 中文资源在线a | 精品爱欲五| 亲子乱AV一区二区三区下载| 日批在线看| 天天爱天天操| 色哟哟性爱av| 五月色天情| 中日韩美欧成人一区二区精品在线| 大伊香蕉玖玖爱| 天天爽天天草| 久操热线| 网色99| 五月丁香婷婷视频| 1024操逼| 六月丁香婷婷天堂| 9久久精品| 啪色综合| 五月婷婷开心五月| 99免费超碰在线| 国产日批视频| 五月天激情四射| 欧美色色色色色色色色色色| 五月激情婷婷丁香天堂| 久久激情网| 久久精品63| 日本一毛片| 激情宗合 激情宗合| 久久A V无码视频| 久久5 9视频免费观看| 丁香婷婷五月激情综合| 五月天综合久久| 激情五月天婷婷直播| A1片久久久| 97视频.干com| 99热只有| 激情综合99| 色玖玖导航| 影音先锋 一区| 天天做天天爽| 色婷婷五月天成人网| 狠狠高潮精品亚洲1| 色五月婷婷天堂| 五月丁香婷婷三级| 久久99免费视频| 婷婷色色婷婷| 一婬一伦一区二区三区| 99爱在线视频| 噜噜狠狠色综合久| 久操福利| wWwCom夜操wwW| 99热这里只有精品在线| 久婷婷五月丁香在线观看| 精品亚洲国产成AV人片传媒| 538在线| 欧美五月停| 久久丁香五月婷婷| 九九九九中文字幕| 久大香蕉| 五月婷婷综合激情网| 五月婷色| 成人丁香婷婷五月天| 婷婷丁香91综合| www.com五月天| 婷婷综合在线视频| 九九九九毛片| 色五月无码| 日本视频久久| 99热综合网| 91一起操| 无码日本精品XXXXXXXXX| 五月天色婷婷基地| 大香蕉九九操| 综合AV在线| 丁香婷五月天| 西西4r午夜剧场| 夜夜爱伊人| www。88热在线视频免费观看| 成人做爰A片免费看视频| 人人舔人人| 99碰碰| 9久热| 五月天激情www| 综合久久9| 人妻久久久| 婷婷五月丁香六月综合网| 亚洲超级碰| 欧美人妻一区二区| 99热这里只有精品最新| 91精品人妻少妇无码影院| 五月婷婷六月丁香| 婷婷王月天影院| 日本三级中国三级99| 极品人妻VIDEOSSS人妻| 五月婷婷激情| 色五月丁香五月五月婷婷| 中文字幕天天干| 欧美日韩99| 五月天综合婷婷| site:901-07.com| 99燥99日| 毛片新网地| 婷婷亚洲在线| 丁香五月色激情| 色五月婷婷网| 99热色精品| 思思热99er在线视频| 99爱爱网| 色婷婷五月天av在线| 99九九在线精品热动漫| 婷婷激情啪啪| 五月婷婷深深的爱| 欧美日本国产| www色色色com| 日韩av在线免费观看| 五月天堂婷婷| 性欧美日本| 久热爱大香蕉在线蜜臀悦色 | 99热最新国内| 99在线观看精品视频| 色色色热热热| 热久久99视频| 国产一级片| 久久宗合影| 日欧一片内射VA在线影院| 9久视频| 无码区婷婷五月花开| 激情伊人六| 久久婷婷五月综合97色一本| 99超碰人人| 九九无码AV| 成人午夜无码视频| 亚洲成人一区| 开心五月网| 婷婷五月天婷婷| 激情五月综合色婷婷| av在线免费播放| 久久精品夜色噜噜亚洲a∨| 岛囯综合激情网| 超碰碰碰碰| 五月丁香在线观看| 日韩成人中文字幕| 激情五月天综合| 色色 9| 综合六月激情婷婷| 婷婷色色综合激情| 久久五月天合网| 99色区| 97人人操在线| 1024手机在线观看看片_日韩精品| 六月丁香激情| 色婷婷aV四虎| 9999热免费视频视频| 日碰日| 久热在线中文字幕色999舞| 色激情五月天| 激情六月天| 99热官网| 亚洲五月婷婷| 91狠狠综合久久| 久久婷婷丁香| 九九热精品| 丁香五月婷婷乱| 五月婷婷m| 五月天激情网址| 九九久久五月天综合伊人| 五月婷婷久久大香蕉| 国产操B| 91婷婷视频| 七月丁香婷婷 色色| 激情久久久| 99热最新网址| 狠狠狠狠狠狠| 五月婷激情| 国产97色在线 | 日韩| 播播网色播播| 丁香五月色网| 色狠狠综合网| 大香蕉综合| 性爱视频99| 中文字幕日产A片在线看| 中文字幕 中文字幕明步| 少妇大叫太大太粗太爽了A片| 色哟呦av| 色婷婷成人久久| 亚洲婷婷久久综合| 色婷婷免费观看| 99r久久这里只有精品| 热久久66| 亚洲最大五月六月丁香婷婷| 激情五月天在线免费美女视频| 久久婷婷五月丁香网| 五月婷婷性爱| 热91久| 婷婷色偷拍| 久99| 日韩一区二区三区无码| 婷婷五月天中文字幕| 婷婷午夜精品久久久| 99欧美| .青娱乐天天操B| 99噜噜噜| 91精产一区三区免费观看| 五月天色色激情综合| 99re这里有精品手机在线| 人人摸人人| 9久精品| 中文成人在线| 六月婷婷视频| 丁香九月激情| 综合六月激情婷婷| 4399在线日本A片| 日韩成人中文| 五月丁香毛片| 久热2025无码| 性综合网| 五月天激情网站| 碰久久精品w| 丁香五月激情六月欧亚激情综合导航| 日日操人人操| 超碰日日操| 亚洲精品第一色色色色色色| 久久久久久97| 婷婷激情另类| 五月婷婷,狠狠操| 久久人妻熟女一区二区| 欧美WW在线网| 久久ER视频com| 97操碰在线视频| 久久久一级AAA| 五月婷婷色色网址| 热这里只有精| 日本久久婷婷| 久久99草五月婷婷| 91精品久久久久久综合五月天| 五月婷婷婷自由综合| 亚洲精品婷婷| 丁香五月123| 久久五月网| 超碰人妻在线| 丁香五月手机视频| 天天艹天天综合网| 五月婷婷婷| 久草婷婷网 | 丁香五月天网站| 8区视频在线| 久久98| 色情成人五月天| 精品久久99码| 婷婷丁香五月天影院 | 99热中文字幕久久| 嫩草AV久久伊人妇女超级A| 综合久久高清| 五月婷婷五月丁香| 专区无日本视频高清8| 大香蕉久久| 97精品在线| 97色视频网| 狠狠干狠狠干狠狠干狠狠干| 26uuu最新地址| 9l视频自拍九色9l视频自拍九色9l社区| WWW丁香五月| 色色色国产| 日本3级片一区2区| 熟女激情五月天| 人人操五月天| 日韩成人AV在线| 91丁香五月| 97操碰在线视频| 色婷婷精品小视频| 久久激情综合| 色婷婷五月天av在线| 91操人视频| 久久大大香| 九九色99| 久久久久久久久月丁| xxx综合在线| 久久九九99| 婷婷激情五月天网站| 久久五月天综合| 99欧美| 噜噜干日本| 日韩综合网络男女香蕉a片| 五月丁香啪啪综合| 一区二区免费看| 五月天久久综合婷婷| AV在线收看| 四月婷婷五月丁香| 色五月婷婷大香蕉| www.com五月天| WWW·色色色·COM| 九九大香蕉黄色影院| 99黄色在线视频精品熟女| 丁香五月天成人| 大香蕉久久久久久久久| 亚洲色五月婷婷| 欧美日比视频| 丁香六月五月天| aaa丁香五月天|