Testing 我可以覆盖RESTClient默认值吗;HttpResponseException“;对>;399返回码?

Testing 我可以覆盖RESTClient默认值吗;HttpResponseException“;对>;399返回码?,testing,groovy,spock,rest-client,Testing,Groovy,Spock,Rest Client,我正在使用Groovy类为我编写的Java Web服务编写一些(spock)验收测试 我遇到的一个挫折是测试答案 200状态很简单: when: def result = callServiceWithValidParams() then: result.status == 200 但是使用400+时,我要么被迫使用try-catch,要么测试默认情况下RESTClient抛出的HttpResponseException when: callWithInvalidParams()

我正在使用Groovy类为我编写的Java Web服务编写一些(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,可能会令人困惑)


在上面的示例中,“错误请求”案例失败。与其返回值,
restClient.get()

client.handler.failure = client.handler.success


我(以前)找到的解决方案:

 restClient.handler.failure = { it }
这是

restClient.handler.failure = { resp -> return resp }

@JimmyLuong在评论中指出,这种方法会从响应中删除数据,并建议进行以下增强:

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

正如Tomasz已经在评论中链接的那样,下面是我在一个类似问题上的一句话

client.handler.failure = client.handler.success

很难理解你面临的障碍。你能发布更多信息吗?params是什么类型的?尝试使用where块定义参数时会发生什么情况?callService()看起来像什么?@AlexBlakemore感谢您的回复。最后的例子只是为了说明我最初的请求可能会如何帮助我。我现在看到它有点混乱,因为我实际上没有显示RESTClient。将
callService(params)
视为客户端的包装,其中
params
值是要发送到服务的查询字符串参数的映射。不过,所有这些都不是很重要。主要的一点是RESTService为200个响应返回一个
结果
,但为400、401等抛出一个错误。。。因此,我无法在我的
then:
block中以标准方式测试响应。我只是编辑了这个示例,希望使其更简单/清晰。那么为什么不制作一个方便的方法,将捕获异常的REST调用包装起来,并将其转换为状态代码呢?我想我可以这样做,但它会变得有点草率。首先,我必须创建一种方法,将错误名称(如“坏请求”、“未授权”等)映射到相应的代码(400401…),这些代码在HttpResponseException中不存在。归根结底,这种方法是可以的(如果你想要一些互联网点,也许值得一个答案),但我只是希望有一种更优雅的方法来实现这一点。对我来说,使用这种解决方案效果很好,除了从响应中删除数据。为了获得数据,我必须做一些类似的事情:restClient.handler.failure={resp,data->resp.setData(data);return resp},@TomaszKalkosiński建议的方法更简单,效果也很好
client.handler.failure = client.handler.success