|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
MockMvc 和 Geb
在上一节中,我们了解了如何将 MockMvc 与 WebDriver 结合使用。在本节中,我们将使用 Geb 让我们的测试更具 Groovy 风格。
为什么选择 Geb 和 MockMvc?
Geb 基于 WebDriver,因此它提供了许多与 WebDriver 相同的优势(参见相同优势)。然而,Geb 通过为我们处理一些样板代码,使事情变得更加简单。
MockMvc 和 Geb 设置
我们可以轻松地使用基于 MockMvc 的 Selenium WebDriver 来初始化一个 Geb Browser,如下所示:
def setup() {
browser.driver = MockMvcHtmlUnitDriverBuilder
.webAppContextSetup(context)
.build()
}
这是一个使用 MockMvcHtmlUnitDriverBuilder 的简单示例。如需更高级的用法,请参阅 高级 MockMvcHtmlUnitDriverBuilder。 |
这确保了任何以 localhost 作为服务器的 URL 都会被定向到我们的
MockMvc 实例,而无需建立真实的 HTTP 连接。其他任何 URL 则会像平常一样通过网络连接发起请求。这使我们能够轻松测试 CDN 的使用。
MockMvc 和 Geb 的使用
现在我们可以像平常一样使用 Geb,而无需将我们的应用程序部署到 Servlet 容器中。例如,我们可以使用以下方式请求创建消息的视图:
to CreateMessagePage
然后我们可以填写表单并提交以创建一条消息,如下所示:
when:
form.summary = expectedSummary
form.text = expectedMessage
submit.click(ViewMessagePage)
任何无法识别的方法调用、属性访问或未找到的引用都会被转发到当前页面对象。这消除了我们在直接使用 WebDriver 时所需的大量样板代码。
与直接使用 WebDriver 一样,这里通过使用页面对象模式(Page Object Pattern)改进了我们之前的
HtmlUnit 测试 的设计。如前所述,我们可以在 HtmlUnit 和 WebDriver 中使用页面对象模式,但在 Geb 中使用起来更加简便。请看我们新的基于 Groovy 的
CreateMessagePage 实现:
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,通过该 URL 可以访问此页面,如下所示:
to CreateMessagePage
我们还有一个 at 闭包,用于判断当前是否位于指定页面。如果我们正处于正确的页面,它应返回 true。正因如此,我们可以像下面这样断言自己正处于正确的页面:
then:
at CreateMessagePage
errors.contains('This field is required.')
| 我们在闭包中使用断言,以便在我们处于错误页面时能够确定问题出在哪里。 |
接下来,我们创建一个 content 闭包,用于指定页面中所有感兴趣的区域。我们可以使用
类似 jQuery 的 Navigator API 来选择我们感兴趣的内容。
最后,我们可以按如下方式验证一条新消息是否已成功创建:
then:
at ViewMessagePage
success == 'Successfully created a new message'
id
date
summary == expectedSummary
message == expectedMessage
如需进一步了解如何充分利用 Geb,请参阅 《Geb 使用手册》。