【问题标题】:Groovy HTTPBuilder Mocking the ClientGroovy HTTPBuilder 模拟客户端
【发布时间】:2012-09-21 16:21:53
【问题描述】:

这个问题与this question密切相关。不同之处在于我想遵循模拟客户端的推荐方法。所以,我定义了以下 HTTPBuilder:

protected readUrl() {
    def http = new HTTPBuilder("http://example.com")
    def status = http.request(Method.GET, ContentType.JSON) {req ->
        response.success = {resp, json ->
            result = json.toString()
            new Success<String>(result)
        }
        response.'401' = {resp ->
            final String errMsg = "Not Authorized"
            new Failed(Failable.Fail.ACCESS_DENIED, errMsg)
        }
        response.failure = {resp ->
            final String errMsg = "General failure ${resp.statusLine}"
            new Failed(Failable.Fail.UNKNOWN, errMsg)
        }
    }
}

我想做的是找到一种方法来对该代码块进行单元测试。我想模拟响应,所以如果可能的话,我可以专门设置响应代码。有人可以告诉我一种方法吗?

【问题讨论】:

  • 我实际上已经通过模拟 HTTPBuilder 进行了编码,但我仍然想看看模拟客户端是什么样子的。
  • 嘲笑“客户”是什么意思?
  • 类似这样的:groovyconsole.appspot.com/script/760001 只需将此模拟设置为您的服务。
  • @Michael 我不确定“客户”应该是什么。有人提到,在我所链接的问题中,嘲笑“客户”是一种更好的方法,但是,我也不知道发帖者的意思。
  • @Raphael 谢谢。我以不同的方式模拟了我的解决方案,但您的代码示例看起来比我的解决方案简单得多。我遇到的最大问题是能够测试不同响应代码的路径。您的示例似乎已经解决了这个问题。

标签: unit-testing grails groovy httpbuilder


【解决方案1】:

这是我的首选解决方案:

class MockHTTPBuilder{
    MockHTTPBuilder(string){}
    MockHTTPBuilder(){}
    def pleaseFail = false
    def mockData = []
    def request(a, b, c){
        if(pleaseFail) [status:'500',data: mockData ?: "It failed :("]
        else [status:'200',data: mockData ?: "Yay :)"]
    }
}

以下是一些示例用法:http://groovyconsole.appspot.com/script/760001

或者,您可以对实际的 httpClient 实例进行元编程并使其行为符合预期(在测试期间强制失败或通过),但这有点复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多