我可以覆盖RESTClient默认的“HttpResponseException”响应> 399返回代码吗?

时间:2013-10-23 16:04:23

标签: testing groovy spock rest-client

我正在使用Groovy RESTClient类为我正在创作的Java WebServices编写一些(spock)验收测试。

我遇到的一个挫折就是测试答案......

200状态很简单:

when:  def result = callServiceWithValidParams()
then:  result.status == 200

但是对于400+,我不得不用try-catch包裹,或者测试默认情况下HttpResponseException投出的RESTClient

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

3 个答案:

答案 0 :(得分:17)

@JonPeterson想出了我认为更好的解决方案,所以我给了his answer复选标记:

client.handler.failure = client.handler.success

More info here


我(之前)提出的解决方案:

 restClient.handler.failure = { it }

这是

的简写
restClient.handler.failure = { resp -> return resp }

@JimmyLuong 在评论中指出此方法会从响应中删除数据,并提出以下增强功能:

 restClient.handler.failure = { resp, data -> resp.setData(data); return resp }

答案 1 :(得分:10)

正如Tomasz在评论中已经链接的那样,这是我在类似问题中的一点{one} answer

client.handler.failure = client.handler.success

答案 2 :(得分:1)

一种方法是创建一个Groovy方便方法,它包装你的REST调用,捕获异常并将它们转换为状态代码