对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

MockMvc 和 HtmlUnit

本节介绍如何集成 MockMvc 和 HtmlUnit。如果你愿意,可以选择这个 以使用原始的 HtmlUnit 库。spring-doc.cadn.net.cn

MockMvc 和 HtmlUnit 设置

首先,确保你已经包含了测试依赖net.sourceforge.htmlunit:htmlunit.为了使用 Apache HttpComponents 的 HtmlUnit。 4.5+,你需要使用 HtmlUnit 2.18 或更高版本。spring-doc.cadn.net.cn

我们可以轻松创建一个 HtmlUnitWeb客户端通过使用MockMvcWeb客户端构建器如下:spring-doc.cadn.net.cn

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()
}
这是一个简单的示例MockMvcWeb客户端构建器.高级用法, 看高深MockMvcWeb客户端构建器.

这确保了任何引用本地主持因为服务器被引导到我们的莫克麦克实例,无需真正的 HTTP 连接。任何其他网址 通过网络连接请求,像往常一样。这让我们可以轻松测试 CDN。spring-doc.cadn.net.cn

MockMvc 和 HtmlUnit 的使用

现在我们可以像平常一样使用 HtmlUnit,但无需部署 应用到Servlet容器中。例如,我们可以请求视图创建 以下信息:spring-doc.cadn.net.cn

HtmlPage createMsgFormPage = webClient.getPage("http://localhost/messages/form");
val createMsgFormPage = webClient.getPage("http://localhost/messages/form")
默认上下文路径为 。或者,我们可以指定上下文路径, 如描述""高深MockMvcWeb客户端构建器.

一旦我们有了对Html页面然后我们可以填写表格并提交 创建消息,如下示例所示:spring-doc.cadn.net.cn

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 库:spring-doc.cadn.net.cn

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 测试。 首先,我们不再需要明确验证表单,然后再发请求 看起来是表格。相反,我们会申请表格,填写并提交,从而完成 大幅降低开销。spring-doc.cadn.net.cn

另一个重要因素是 HtmlUnit 使用 Mozilla Rhino 引擎来评估 JavaScript。这意味着我们也可以进行测试 JavaScript在我们页面中的行为。spring-doc.cadn.net.cn

请参见 HtmlUnit 文档 关于使用 HtmlUnit 的更多信息。spring-doc.cadn.net.cn

高深MockMvcWeb客户端构建器

在目前的例子中,我们用了MockMvcWeb客户端构建器以最简单的方式 可能,通过构建一个Web客户端基于WebApplicationContext由 Spring TestContext 框架。这种方法在下面的例子中重复:spring-doc.cadn.net.cn

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()
}

我们还可以指定额外的配置选项,如下示例所示:spring-doc.cadn.net.cn

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()
}

作为替代方案,我们可以通过配置莫克麦克实例分别提供给MockMvcWeb客户端构建器如下:spring-doc.cadn.net.cn

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 https://youtrack.jetbrains.com/issue/KT-22208 is fixed

这更为冗长,但通过构建Web客户端其中莫克麦克例如,我们有 MockMvc的全部力量触手可及。spring-doc.cadn.net.cn

关于创建莫克麦克实例,参见设置选择