跳到主要内容
版本:7.0.3

MockMvc和Geb

Hunyuan 7b 中英对照 MockMvc and Geb

在前一节中,我们学习了如何将MockMvc与WebDriver结合使用。在本节中,我们将使用Geb来让我们的测试更加符合Groovy的风格(即更具Groovy的特性)。

为什么选择Geb和MockMvc?

Geb由WebDriver支持,因此它提供了与WebDriver相同的许多优势[(参见webdriver.md#mockmvc-server-htmlunit-webdriver-why)]。不过,Geb通过帮助我们处理一些样板代码,使事情变得更加简单。

MockMvc和Geb配置

我们可以很容易地使用一个结合了MockMvc的Selenium WebDriver来初始化一个Geb Browser,具体步骤如下:

def setup() {
browser.driver = MockMvcHtmlUnitDriverBuilder
.webAppContextSetup(context)
.build()
}
备注

这是一个使用MockMvcHtmlUnitDriverBuilder的简单示例。有关更高级的用法,请参阅Advanced 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。这样我们就可以导航到该页面了,具体方法如下:

to CreateMessagePage

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

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

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

接下来,我们创建一个content闭包,该闭包指定了页面内的所有感兴趣的区域。我们可以使用一种类似JQuery的Navigator API来选择我们感兴趣的内容。

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

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

有关如何充分利用Geb的更多详细信息,请参阅《Geb手册》