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

MockMvc 与 Geb

在上一节中,我们看到了如何使用MockMvc与WebDriver。在本节中,我们 使用 Geb 使我们的测试更加Groovy。spring-doc.cadn.net.cn

为什么选择Geb和MockMvc?

Geb 由 WebDriver 支持,因此它提供了许多我们从 WebDriver 获得的相同的好处。然而,Geb 通过为我们处理一些样板代码,使得事情变得更加简单。spring-doc.cadn.net.cn

MockMvc 和 Geb 设置

我们可以轻松地使用MockMvc提供的Selenium WebDriver初始化一个Geb Browser,如下所示:spring-doc.cadn.net.cn

def setup() {
	browser.driver = MockMvcHtmlUnitDriverBuilder
		.webAppContextSetup(context)
		.build()
}
这是一个使用MockMvcHtmlUnitDriverBuilder的简单示例。有关更高级的用法,请参阅高级MockMvcHtmlUnitDriverBuilder

这确保了任何引用localhost作为服务器的URL都会被定向到我们的MockMvc实例,而无需实际的HTTP连接。任何其他URL都像平常一样通过网络连接请求。这让我们可以轻松测试CDN的使用。spring-doc.cadn.net.cn

MockMvc 和 Geb 的使用

现在我们可以像平常一样使用 Geb,而无需将应用程序部署到 Servlet 容器中。例如,我们可以请求视图以创建一条消息,如下所示:spring-doc.cadn.net.cn

to CreateMessagePage

然后我们可以填写表单并提交以创建消息,如下所示:spring-doc.cadn.net.cn

when:
form.summary = expectedSummary
form.text = expectedMessage
submit.click(ViewMessagePage)

任何未识别的方法调用或属性访问或引用如果找不到,都会转发到当前的页面对象。这消除了我们在直接使用WebDriver时需要的大量样板代码。spring-doc.cadn.net.cn

与直接使用WebDriver类似,这通过使用页面对象模式改进了我们的HtmlUnit测试的设计。如前所述,我们可以在HtmlUnit和WebDriver中使用页面对象模式,但在Geb中使用它更加简单。考虑我们新的Groovy基础的CreateMessagePage实现:spring-doc.cadn.net.cn

class CreateMessagePage extends Page {
	static url = 'messages/form'
	static at = { assert title == 'Messages : Create'; true }
	static content =  {
		submit { $('input[type=submit]') }
		form { $('form') }
		errors(required:false) { $('label.error, .alert-error')?.text() }
	}
}

我们的CreateMessagePage扩展了Page。我们不会详细介绍Page,但简而言之,它包含了我们所有页面的通用功能。我们定义了一个URL,该页面可以在其中找到。这使我们可以导航到该页面,如下所示:spring-doc.cadn.net.cn

to CreateMessagePage

我们还有一个at闭包,用于确定我们是否在指定的页面上。如果我们在正确的页面上,它应该返回true。这就是为什么我们可以断言我们在正确的页面上,如下所示:spring-doc.cadn.net.cn

then:
at CreateMessagePage
errors.contains('This field is required.')
我们在闭包中使用断言,以便在页面错误时确定问题出在哪里。

接下来,我们创建一个 content 闭包,该闭包指定了页面内所有感兴趣的部分。我们可以使用一个 类似jQuery的Navigator API 来选择我们感兴趣的内容。spring-doc.cadn.net.cn

最后,我们可以验证成功创建了一条新消息,如下:spring-doc.cadn.net.cn

then:
at ViewMessagePage
success == 'Successfully created a new message'
id
date
summary == expectedSummary
message == expectedMessage

有关如何充分利用Geb的更多详细信息,请参阅 Geb之书用户手册。spring-doc.cadn.net.cn