此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
MockMvc 和 HtmlUnit
本节介绍如何集成 MockMvc 和 HtmlUnit。如果需要,请使用此选项使用原始 HtmlUnit 库。
MockMvc 和 HtmlUnit 设置
首先,确保已包含对org.htmlunit:htmlunit
.
我们可以轻松创建一个 HtmlUnitWebClient
通过使用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 . |
这可确保引用的任何 URLlocalhost
因为服务器被定向到我们的MockMvc
实例,无需真正的 HTTP 连接。任何其他 URL 都是像往常一样使用网络连接请求的。这使我们可以轻松测试CDN 的使用。
MockMvc 和 HtmlUnit 用法
现在我们可以像往常一样使用 HtmlUnit,但不需要将应用程序部署到 Servlet 容器。例如,我们可以请求视图创建一个消息,其中包含以下内容:
-
Java
-
Kotlin
HtmlPage createMsgFormPage = webClient.getPage("http://localhost/messages/form");
val createMsgFormPage = webClient.getPage("http://localhost/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
以最简单的方式
可能,通过构建一个WebClient
基于WebApplicationContext
由Spring TestContext 框架为我们加载。在以下示例中重复了这种方法:
-
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
这更冗长,但是,通过构建WebClient
使用MockMvc
实例,我们有
MockMvc 的全部功能触手可及。
有关创建MockMvc 实例,请参阅配置 MockMvc。 |