跳到主要内容

MockMvc 和 Geb

DeepSeek V3 中英对照 MockMvc and 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()
}
groovy
备注

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

这确保了任何引用 localhost 作为服务器的 URL 都被重定向到我们的 MockMvc 实例,而无需真正的 HTTP 连接。任何其他 URL 则像往常一样通过使用网络连接来请求。这让我们能够轻松测试 CDN 的使用。

MockMvc 和 Geb 的使用

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

to CreateMessagePage
groovy

然后我们可以填写表单并提交以创建消息,如下所示:

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

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

与直接使用 WebDriver 一样,这通过使用页面对象模式改进了我们的 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() }
}
}
groovy

我们的 CreateMessagePage 继承自 Page。我们不会详细讨论 Page 的细节,但总的来说,它包含了我们所有页面的通用功能。我们定义了一个可以找到此页面的 URL。这让我们可以导航到该页面,如下所示:

to CreateMessagePage
groovy

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

then:
at CreateMessagePage
errors.contains('This field is required.')
groovy
备注

我们在闭包中使用了一个断言,这样如果我们在错误的页面上,就可以确定问题出在哪里。

接下来,我们创建一个 content 闭包,用于指定页面内所有感兴趣的区域。我们可以使用 jQuery 风格的导航 API 来选择我们感兴趣的内容。

最后,我们可以验证新消息是否成功创建,如下所示:

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

有关如何充分利用 Geb 的更多详细信息,请参阅 The Book of Geb 用户手册。