Groovy HTTPBuilder 模拟响应

10

我正试图找出如何为我要编写的服务编写测试用例。

该服务将使用HTTPBuilder请求来自某个URL的响应。 HTTPBuilder请求只需要检查响应是否成功或失败。 服务实现将非常简单,类似于:

boolean isOk() {
    httpBuilder.request(GET) {
        response.success = { return true }
        response.failure = { return false }
    }
}

我想要模拟HTTPBuilder,以便在测试中将响应设置为成功或失败,以便在响应成功时断言我的服务的isOk方法返回True,而在响应失败时返回False。请问如何在GroovyTestCase中模拟HTTPBuilder请求并设置响应?

1个回答

12

这里是一个最简单的例子,展示了如何使用模拟的 HttpBuilder 来处理你的测试用例:

class MockHttpBuilder {
    def result
    def requestDelegate = [response: [:]]

    def request(Method method, Closure body) {
        body.delegate = requestDelegate
        body.call()
        if (result)
            requestDelegate.response.success()
        else
            requestDelegate.response.failure()
    }
}
如果result字段为true,它会调用success闭包,否则调用failure闭包。
编辑:这是一个使用MockFor而不是模拟类的示例:
import groovy.mock.interceptor.MockFor

def requestDelegate = [response: [:]]
def mock = new MockFor(HttpBuilder)
mock.demand.request { Method method, Closure body ->
    body.delegate = requestDelegate
    body.call()
    requestDelegate.response.success() // or failure depending on what's being tested
}
mock.use {
    assert isOk() == true
}

谢谢回复。我不明白会将'result'设置为true/false的是什么。而且这不更像是一个存根(Stub)而不是一个模拟(Mock)吗? - C0deAttack
当您设置测试时,必须自己设置结果。例如:new MockHttpBuilder(result: true)。我添加了一个使用Groovy模拟的替代方案。 - ataylor
Ataylor的回答很好,我想出了基本相同的实现方式,只是我直接设置响应状态,然后使用它来执行映射中正确的闭包。但这确实是Stub模拟。我认为正确的方法是模拟提供响应的客户端。 - Gepsens
你能举个例子,说明成功和失败实际上都返回了一些数据吗?另外,URI和头信息是否有任何区别? - Anuj Kulkarni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接