跳到主要内容
版本:7.0.3

MockMvc 和 HtmlUnit

Hunyuan 7b 中英对照 MockMvc and HtmlUnit

本节描述了如何集成MockMvc和HtmlUnit。如果您想使用原始的HtmlUnit库,请使用此选项。

MockMvc和HtmlUnit设置

首先,请确保您已经包含了orghtmlunit:htmlunit的测试依赖。

我们可以很容易地使用MockMvcWebClientBuilder创建一个与MockMvc集成的HtmlUnit WebClient,如下所示:

WebClient webClient;

@BeforeEach
void setup(WebApplicationContext context) {
webClient = MockMvcWebClientBuilder
.webAppContextSetup(context)
.build();
}
备注

这是一个使用MockMvcWebClientBuilder的简单示例。有关高级用法,请参阅Advanced MockMvcWebClientBuilder

这确保了任何将 localhost 作为服务器的 URL 都会被直接导向我们的 MockMvc 实例,而无需进行真实的 HTTP 连接。其他任何 URL 则会像平常一样通过网络连接来请求。这样我们就可以轻松地测试内容分发网络(CDN)的使用情况了。

MockMvc和HtmlUnit的使用

现在我们可以像平常一样使用HtmlUnit了,而无需将我们的应用程序部署到Servlet容器中。例如,我们可以通过以下方式请求创建消息的视图:

HtmlPage createMsgFormPage = webClient.getPage("http://localhost/messages/form");
备注

默认的上下文路径是“”。或者,我们可以像在Advanced MockMvcWebClientBuilder中描述的那样指定上下文路径。

一旦我们有了对HtmlPage的引用,我们就可以填写表单并提交它来创建一条消息,如下例所示:

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

最后,我们可以验证新消息已成功创建。以下断言使用了AssertJ库:

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!");

前面的代码在多个方面改进了我们的MockMvc测试。首先,我们不再需要显式地验证表单,然后创建一个与表单样式相同的请求。相反,我们可以直接请求表单,填写表单内容并提交它,从而大大减少了开销。

另一个重要因素是 HtmlUnit 使用 Mozilla Rhino 引擎 来执行 JavaScript 代码。这意味着我们也可以测试页面中 JavaScript 的行为。

有关使用HtmlUnit的更多信息,请参阅HtmlUnit文档

高级 MockMvcWebClientBuilder

在迄今为止的示例中,我们以最简单的方式使用了MockMvcWebClientBuilder,即基于Spring TestContext框架为我们加载的WebApplicationContext来构建一个WebClient。在以下示例中,这种做法也被重复使用:

WebClient webClient;

@BeforeEach
void setup(WebApplicationContext context) {
webClient = MockMvcWebClientBuilder
.webAppContextSetup(context)
.build();
}

我们还可以指定额外的配置选项,如下例所示:

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

作为另一种选择,我们可以通过单独配置MockMvc实例并将其提供给MockMvcWebClientBuilder来执行完全相同的设置,具体如下:

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

这样描述可能更啰嗦一些,但是,通过使用MockMvc实例来构建WebClient,我们就可以充分利用MockMvc的所有功能了。

提示

有关创建MockMvc实例的更多信息,请参阅配置MockMvc