将Wiremock集成到Spring Boot Java Web应用程序中以模拟外部依赖关系
介紹
WireMock是用于基于HTTP的API的模擬服務器。 有些人可能會將其視為服務虛擬化工具或模擬服務器。 它使您能夠存根所需的API或其他外部依賴項,以加快本地開發速度。 它支持測試真實API無法可靠產生的極端情況和失敗模式。 在模擬單元測試和集成測試中的外部依賴關系時,它也很有用。 它與jUnit具有出色的集成。
添加Wiremock依賴性
首先,您將要添加Wiremock依賴項。 您可以下載常規依賴項或包含所有依賴項的胖JAR獨立版本。 我們將在此處使用標準依賴項。 將以下依賴項添加到您的build.gradle中
build.gradle
dependencies {testCompile('com.github.tomakehurst:wiremock:2.1.12') }添加Wiremock單元測試
這是完整的單元測試,可用于測試與Wiremock的集成。 該單元測試使用jUnit4規則啟動端口8089上的Wiremock服務器,并在每次測試后將其關閉。 我們使用stubFor方法來定義模擬的終點和響應。 我們使用Spring RestTemplate創建一個到模擬服務器的HTTP請求并捕獲結果。
WiremockTests.java
public class WiremockTests {RestTemplate restTemplate;ResponseEntity response;@Rulepublic WireMockRule wireMockRule = new WireMockRule(wireMockConfig().port(8089).httpsPort(8443));@Beforepublic void setup() throws Exception {restTemplate = new RestTemplate();response = null;}@Testpublic void givenWireMockAdminEndpoint_whenGetWithoutParams_thenVerifyRequest() {RestTemplate restTemplate = new RestTemplate();response = restTemplate.getForEntity("http://localhost:8089/__admin", String.class);assertThat("Verify Response Body", response.getBody().contains("mappings"));assertThat("Verify Status Code", response.getStatusCode().equals(HttpStatus.OK));}@Testpublic void givenWireMockEndpoint_whenGetWithoutParams_thenVerifyRequest() {stubFor(get(urlEqualTo("/api/resource/")).willReturn(aResponse().withStatus(HttpStatus.OK.value()).withHeader("Content-Type", TEXT_PLAIN_VALUE).withBody("test")));response = restTemplate.getForEntity("http://localhost:8089/api/resource/", String.class);assertThat("Verify Response Body", response.getBody().contains("test"));assertThat("Verify Status Code", response.getStatusCode().equals(HttpStatus.OK));verify(getRequestedFor(urlMatching("/api/resource/.*")));} }您可以運行此測試,如果完成,則您已成功將Wiremock集成到應用程序中。
深入到單元測試
這是一些靜態導入,您可以在測試中使用這些靜態導入來提高可讀性和簡潔性。
WiremockTests.java
import static com.github.tomakehurst.wiremock.client.WireMock.*; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; import static org.hamcrest.MatcherAssert.assertThat; import static org.springframework.http.MediaType.TEXT_PLAIN_VALUE;jUnit4規則
這個jUnit4 @rule將自動管理Wiremock服務器的生命周期以及每個測試用例的啟動和關閉Wiremock。 您也可以使用setup()和teardown()方法來實現,但是jUnit4規則更加簡潔明了。
WiremockTests.java
@Rulepublic WireMockRule wireMockRule = new WireMockRule(wireMockConfig().port(8089).httpsPort(8443));殘端和響應
此代碼使用stubFor()方法(已靜態導入)定義端點, / api / resource /和純文本響應主體“ test”。您也可以使用此方法通過更改Content-返回JSON或XML響應。類型和響應主體
WiremockTests.java
stubFor(get(urlEqualTo("/api/resource/")).willReturn(aResponse().withStatus(HttpStatus.OK.value()).withHeader("Content-Type", TEXT_PLAIN_VALUE).withBody("test")));春天RestTemplate
我們使用Spring RestTemplate類對http:// localhost:8089 / api / resource /執行GET HTTP請求,以打到Wiremock服務器的存根端點。 在這種情況下,我們期望一個String.class實體響應,因為那是我們在stubFor()方法中定義的。 如果您配置了POJO對象,則需要定義一個POJO對象以從存根方法捕獲JSON響應。 我們在ResponseEntity對象中捕獲響應,該對象捕獲響應主體,標頭和狀態代碼以及有關請求的其他信息。
WiremockTests.java
response = restTemplate.getForEntity("http://localhost:8089/api/resource/", String.class);手動啟動和停止Wiremock服務器
您可以手動啟動和停止Wiremock服務器,而無需使用jUnit4規則來管理生命周期。 當您的應用程序啟動時,您可能希望這樣做是一種引導方法。
ServiceClass.java
WireMockServer wireMockServer = new WireMockServer(wireMockConfig().port(8089)); //No-args constructor will start on port 8080, no HTTPS wireMockServer.start();WireMock.reset();wireMockServer.stop();結論
現在,您的項目中已安裝Wiremock。 您可以在單元測試和集成測試中使用Wiremock來對外部依賴關系進行存根,也可以加快本地環境中的開發。 您可以在此處閱讀有關設置Wiremock的更多信息: http ://wiremock.org/docs/getting-started/
翻譯自: https://www.javacodegeeks.com/2016/09/integrate-wiremock-spring-boot-java-web-application-mocking-external-dependencies.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的将Wiremock集成到Spring Boot Java Web应用程序中以模拟外部依赖关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓锁屏图案忘记了怎么解锁(安卓锁屏图案
- 下一篇: linux 命令 文件夹大小(linux