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

时间:2013-11-04 20:57:25

标签: unit-testing groovy spock gmock

我修改了here中的代码,看起来非常像我的代码,并且正在尝试创建单元测试。虽然我会喜欢询问“测试这个的最佳方法”,但我会非常满意任何方式来创建一个像样的单元测试!我查看了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

我可能完全错误地接近了这一点,并且将对开展单元测试此类代码的“正确方法”持开放态度。请耐心等待,因为这对我来说是新的!

1 个答案:

答案 0 :(得分:0)

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

Spock模拟很好地记录在案 the new spock docs

如果您确实想要从客户端测试Web服务,请查看geb,它可以作为spock的伴侣。 Geb记录在the Book of Geb中。网上集成测试显然涉及更多移动部件,因此您可以通过模拟服务器端来开始。