MockMvc 和 HtmlUnit
本節說明如何整合 MockMvc 和 HtmlUnit。如果您想要使用原始的 HtmlUnit 程式庫,請使用此選項。
MockMvc 和 HtmlUnit 設定
首先,請確保您已包含 org.htmlunit:htmlunit
的測試相依性。
我們可以輕鬆地建立與 MockMvc 整合的 HtmlUnit WebClient
,方法是使用 MockMvcWebClientBuilder
,如下所示
-
Java
-
Kotlin
WebClient webClient;
@BeforeEach
void setup(WebApplicationContext context) {
webClient = MockMvcWebClientBuilder
.webAppContextSetup(context)
.build();
}
lateinit var webClient: WebClient
@BeforeEach
fun setup(context: WebApplicationContext) {
webClient = MockMvcWebClientBuilder
.webAppContextSetup(context)
.build()
}
這是使用 MockMvcWebClientBuilder 的簡單範例。如需進階用法,請參閱進階 MockMvcWebClientBuilder 。 |
這確保任何參考 localhost
作為伺服器的 URL 都會導向我們的 MockMvc
實例,而無需實際的 HTTP 連線。任何其他 URL 都會透過網路連線正常請求。這讓我們可以輕鬆測試 CDN 的使用。
MockMvc 和 HtmlUnit 用法
現在我們可以像平常一樣使用 HtmlUnit,但無需將應用程式部署到 Servlet 容器。例如,我們可以使用以下方式請求視圖來建立訊息
-
Java
-
Kotlin
HtmlPage createMsgFormPage = webClient.getPage("https://127.0.0.1/messages/form");
val createMsgFormPage = webClient.getPage("https://127.0.0.1/messages/form")
預設的 Context 路徑為 "" 。或者,我們可以指定 Context 路徑,如進階 MockMvcWebClientBuilder 中所述。 |
一旦我們取得 HtmlPage
的參考,我們就可以填寫表單並提交以建立訊息,如下列範例所示
-
Java
-
Kotlin
HtmlForm form = createMsgFormPage.getHtmlElementById("messageForm");
HtmlTextInput summaryInput = createMsgFormPage.getHtmlElementById("summary");
summaryInput.setValueAttribute("Spring Rocks");
HtmlTextArea textInput = createMsgFormPage.getHtmlElementById("text");
textInput.setText("In case you didn't know, Spring Rocks!");
HtmlSubmitInput submit = form.getOneHtmlElementByAttribute("input", "type", "submit");
HtmlPage newMessagePage = submit.click();
val form = createMsgFormPage.getHtmlElementById("messageForm")
val summaryInput = createMsgFormPage.getHtmlElementById("summary")
summaryInput.setValueAttribute("Spring Rocks")
val textInput = createMsgFormPage.getHtmlElementById("text")
textInput.setText("In case you didn't know, Spring Rocks!")
val submit = form.getOneHtmlElementByAttribute("input", "type", "submit")
val newMessagePage = submit.click()
最後,我們可以驗證是否已成功建立新訊息。以下斷言使用 AssertJ 程式庫
-
Java
-
Kotlin
assertThat(newMessagePage.getUrl().toString()).endsWith("/messages/123");
String id = newMessagePage.getHtmlElementById("id").getTextContent();
assertThat(id).isEqualTo("123");
String summary = newMessagePage.getHtmlElementById("summary").getTextContent();
assertThat(summary).isEqualTo("Spring Rocks");
String text = newMessagePage.getHtmlElementById("text").getTextContent();
assertThat(text).isEqualTo("In case you didn't know, Spring Rocks!");
assertThat(newMessagePage.getUrl().toString()).endsWith("/messages/123")
val id = newMessagePage.getHtmlElementById("id").getTextContent()
assertThat(id).isEqualTo("123")
val summary = newMessagePage.getHtmlElementById("summary").getTextContent()
assertThat(summary).isEqualTo("Spring Rocks")
val text = newMessagePage.getHtmlElementById("text").getTextContent()
assertThat(text).isEqualTo("In case you didn't know, Spring Rocks!")
先前的程式碼在許多方面改進了我們的MockMvc 測試。首先,我們不再需要明確驗證我們的表單,然後建立看起來像表單的請求。相反地,我們請求表單、填寫並提交,從而顯著減少了 overhead。
另一個重要因素是 HtmlUnit 使用 Mozilla Rhino 引擎來評估 JavaScript。這表示我們也可以測試頁面中 JavaScript 的行為。
請參閱 HtmlUnit 文件,以取得有關使用 HtmlUnit 的其他資訊。
進階 MockMvcWebClientBuilder
到目前為止的範例中,我們以盡可能簡單的方式使用 MockMvcWebClientBuilder
,方法是根據 Spring TestContext Framework 為我們載入的 WebApplicationContext
建立 WebClient
。以下範例重複了此方法
-
Java
-
Kotlin
WebClient webClient;
@BeforeEach
void setup(WebApplicationContext context) {
webClient = MockMvcWebClientBuilder
.webAppContextSetup(context)
.build();
}
lateinit var webClient: WebClient
@BeforeEach
fun setup(context: WebApplicationContext) {
webClient = MockMvcWebClientBuilder
.webAppContextSetup(context)
.build()
}
我們也可以指定其他組態選項,如下列範例所示
-
Java
-
Kotlin
WebClient webClient;
@BeforeEach
void setup() {
webClient = MockMvcWebClientBuilder
// demonstrates applying a MockMvcConfigurer (Spring Security)
.webAppContextSetup(context, springSecurity())
// for illustration only - defaults to ""
.contextPath("")
// By default MockMvc is used for localhost only;
// the following will use MockMvc for example.com and example.org as well
.useMockMvcForHosts("example.com","example.org")
.build();
}
lateinit var webClient: WebClient
@BeforeEach
fun setup() {
webClient = MockMvcWebClientBuilder
// demonstrates applying a MockMvcConfigurer (Spring Security)
.webAppContextSetup(context, springSecurity())
// for illustration only - defaults to ""
.contextPath("")
// By default MockMvc is used for localhost only;
// the following will use MockMvc for example.com and example.org as well
.useMockMvcForHosts("example.com","example.org")
.build()
}
作為替代方案,我們可以執行完全相同的設定,方法是單獨配置 MockMvc
實例並將其提供給 MockMvcWebClientBuilder
,如下所示
-
Java
-
Kotlin
MockMvc mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
webClient = MockMvcWebClientBuilder
.mockMvcSetup(mockMvc)
// for illustration only - defaults to ""
.contextPath("")
// By default MockMvc is used for localhost only;
// the following will use MockMvc for example.com and example.org as well
.useMockMvcForHosts("example.com","example.org")
.build();
// Not possible in Kotlin until {kotlin-issues}/KT-22208 is fixed
這更為冗長,但是,透過使用 MockMvc
實例建立 WebClient
,我們可以充分利用 MockMvc 的強大功能。
如需有關建立 MockMvc 實例的其他資訊,請參閱配置 MockMvc。 |