Unit testing 如何使用嵌套闭包在Groovy中进行单元测试(模拟类)?

Unit testing 如何使用嵌套闭包在Groovy中进行单元测试(模拟类)?,unit-testing,groovy,spock,gmock,Unit Testing,Groovy,Spock,Gmock,我修改了中的代码,使其看起来非常像我所拥有的代码,并尝试为其创建单元测试。虽然我想问“什么是最好的方法”来测试这个,但我对任何创建一个像样的单元测试的方法都非常满意!我研究了Spock、GroovyTestCase和GMock,虽然它们中的每一个都可能非常有能力创建这样的测试,但我发现在所有情况下都缺少此类示例的文档 class Searcher { def http = new HTTPBuilder('http://ajax.googleapis.com') def _e

我修改了中的代码,使其看起来非常像我所拥有的代码,并尝试为其创建单元测试。虽然我想问“什么是最好的方法”来测试这个,但我对任何创建一个像样的单元测试的方法都非常满意!我研究了Spock、GroovyTestCase和GMock,虽然它们中的每一个都可能非常有能力创建这样的测试,但我发现在所有情况下都缺少此类示例的文档

class Searcher {

    def http = new HTTPBuilder('http://ajax.googleapis.com')

    def _executeSearch = { searchQ -> {
            req ->
            uri.path = '/ajax/services/search/web'
            uri.query = searchQ
            requestContentType = URLENC
            response.success = { resp, reader ->
                assert resp.statusLine.statusCode == 200
                reader.text
            }
            response.failure = { resp -> println "FAILURE! ${resp.properties}" 
                                 resp.statusLine.statusCode  }
        }
    }

    def executeSearch(query) {
        // http.setHeaders(Accept: 'application/json')  // I want JSON back, but this not important
        http.request(GET, _executeGetCommand(query))
    }
}
我想要/需要做的是以我可以测试的方式模拟“http”:

1. uri.query is getting properly set via the passed in data
2. calls to response.success return mocked test data
3. calls to failure get executed and return the failure code

我很可能完全错误地理解了这一点,并将以“正确的方式”对这类代码进行单元测试。请容忍我,因为这对我来说是新的

我会使用Spock mock的测试用例。它们应该非常简单,因为在单元测试期间您不需要任何实际的网络交互

Spock模拟在


如果您确实想从客户端测试web服务,请查看geb,它是spock的一个很好的伴侣。Geb在web上的集成测试中被记录在案,显然涉及到更多的活动部件,因此您从模拟服务器端开始是正确的。

决定使用
spock
是一个明智的决定。你在斯波克试过什么?有趣的是,我以为你会说这是一个“非常合乎逻辑”的决定-哈哈。我没有尝试过任何东西,因为我发现的每个示例都是针对基本上微不足道的东西的,并且找不到类似上述内容的示例规范。