【发布时间】:2013-10-23 16:04:22
【问题描述】:
我正在使用 Groovy RESTClient 类为我一直在创作的 Java WebServices 编写一些 (spock) 验收测试。
我遇到的一个挫折是在测试响应时...
200 状态很简单:
when: def result = callServiceWithValidParams()
then: result.status == 200
但是对于400+,我不得不要么包装在try-catch 中,要么测试RESTClient 默认抛出的HttpResponseException。
when:
callWithInvalidParams()
then:
def e = thrown(Exception)
e.message == 'Bad Request'
这还不错,虽然有点令人沮丧……但我想做得更好。
理想情况下,我希望我的测试更像这样 (如果你不使用 groovy/spock 可能会令人困惑)
@Unroll
def "should return #statusCode '#status' Response"()
{
when:
def result = restClient.get(path: PATH, query: [param: parameter])
then:
result.status == statusCode
where:
status | statusCode | parameter
'OK' | 200 | validParam
'Bad Request' | 400 | invalidParam
}
在上面的示例中,“错误请求”案例失败。 restClient.get() 不是返回值,而是抛出 HttpResponseException
【问题讨论】:
-
很难理解你面临的障碍。你能发布更多信息吗?参数是什么类型?当您尝试使用 where 块来定义参数时会发生什么? callService() 是什么样子的?
-
@AlexBlakemore 感谢您的回复。最后的示例只是为了说明我的原始请求如何帮助我。我现在看到它有点令人困惑,因为我实际上并没有显示 RESTClient。将
callService(params)视为客户端的包装器,其中params值是要发送到服务的queryString 参数的映射。不过,所有这些都不是很重要。要点是 RESTService 为 200 个响应返回一个result,但对 400、401 等抛出一个错误......所以我无法在我的then:块中以标准方式测试响应 -
刚刚编辑了示例以希望使其更简单/清晰。
-
那为什么不做一个方便的方法来包装你的 REST 调用来捕获异常并将它们转换为状态码呢?
-
我想我可以这样做,但它会变得有点草率。一方面,我必须创建一种方法来将错误名称(如“错误请求”、“未授权”...)映射到 HttpResponseException 中不存在的相应代码(400、401...) .归根结底,这种方法是可以的(如果你想要一些互联网点,也许值得一个答案),但我只是希望可能有一种更优雅的方法来实现这一点。
标签: testing groovy spock rest-client