2015-12-29 40 views
4

我想在當前上下文之外的URL上執行POST請求,並且它看起來像Spring無法理解它。春季測試MockMvc對外部URL執行請求

測試代碼:

 String content = mvc 
      .perform(post("http://some-external-url.com:8080/somepath) 
        .header("Authorization", authorization) 
        .contentType(MediaType.APPLICATION_FORM_URLENCODED) 
        .param("username", username) 
        .param("password", password) 
      .andExpect(status().isOk()) 
      .andReturn().getResponse().getContentAsString(); 

的工作原理是在當前上下文的魅力。但遠程服務根本無法達成。好像「http://some-external-url.com:8080」部分被忽略。

模擬創建代碼:

mvc = MockMvcBuilders.webAppContextSetup(context).build(); 

有沒有什麼辦法讓它工作嗎?因爲使用標準的Java HttpUrlConnection類是一個巨大的痛苦。

+0

你爲什麼期望MockMvc可以在外部URL上工作? – chrylis

+0

爲什麼不呢?這只是一個測試工具,對吧?首先要正確測試我的控制器,我應該從外部Web服務獲取一些信息。我不認爲這是非常罕見的情況。 –

+0

這是一個測試工具,非常具體地模擬Servlet堆棧的一個小的孤立部分。在任何地方都沒有涉及HTTP客戶端,只有HTTP服務器的一部分。你可能會說,因爲Selenium是一個測試工具,所以它應該修改數據庫模式。 – chrylis

回答

3

不可以。使用Spring MVC測試框架無法與外部服務器(或任何實際的服務器)一起工作。

Spring Reference Manual所述,

春季MVC測試框架提供用於使用流利API,可以用JUnit使用, TestNG的,或任何其他測試框架測試 Spring MVC的代碼一流的支持。它建立在來自spring-test模塊的Servlet API 模擬對象上,因此不會使用運行Servlet容器的 。

最後一句拼出來:Spring MVC Test does 不是使用正在運行的Servlet容器。事實上,它不能與運行的Servlet容器或任何類型的實際服務器(本地或遠程)一起使用。

作爲替代方案,如果你必須對外部服務器測試,然後你可以考慮使用REST Assured代替Spring MVC的測試對於那些特殊情況。

+0

謝謝你的解釋。 –

+1

供參考:我添加了關於REST Assured的說明。 –