MockMvc 和 HtmlUnit

本節描述瞭如何整合 MockMvc 和 HtmlUnit。如果您想使用原始的 HtmlUnit 庫,請選擇此選項。

MockMvc 和 HtmlUnit 設定

首先,請確保您已新增對 org.htmlunit:htmlunit 的測試依賴項。

我們可以透過使用 MockMvcWebClientBuilder 輕鬆建立一個與 MockMvc 整合的 HtmlUnit 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()
}
這是使用 MockMvcWebClientBuilder 的一個簡單示例。有關高階用法,請參閱 高階 MockMvcWebClientBuilder

這確保任何引用 localhost 作為伺服器的 URL 都將直接指向我們的 MockMvc 例項,而無需實際的 HTTP 連線。其他任何 URL 都將像往常一樣透過網路連線請求。這使我們能夠輕鬆測試 CDN 的使用。

MockMvc 和 HtmlUnit 用法

現在我們可以像往常一樣使用 HtmlUnit,而無需將我們的應用程式部署到 Servlet 容器。例如,我們可以透過以下方式請求檢視以建立訊息:

  • Java

  • Kotlin

HtmlPage createMsgFormPage = webClient.getPage("https:///messages/form");
val createMsgFormPage = webClient.getPage("https:///messages/form")
預設上下文路徑為 ""。或者,我們可以指定上下文路徑,如 高階 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 測試。首先,我們不再需要明確驗證我們的表單,然後建立看起來像該表單的請求。相反,我們請求表單,填寫並提交,從而顯著減少了開銷。

另一個重要因素是 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();
val mockMvc = MockMvcBuilders
		.webAppContextSetup(context)
		.apply<DefaultMockMvcBuilder>(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()

這更冗長,但透過使用 MockMvc 例項構建 WebClient,我們擁有 MockMvc 的全部功能。

有關建立 MockMvc 例項的更多資訊,請參閱 配置 MockMvc
© . This site is unofficial and not affiliated with VMware.