2012-02-01 226 views
7

我想弄清楚如何爲我要編寫的服務編寫測試用例。Groovy HTTPBuilder模擬響應

該服務將使用HTTPBuilder來請求來自某個URL的響應。 HTTPBuilder請求只需要檢查響應是否成功或失敗。服務實現會是這麼簡單的東西:

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

所以,我希望能夠嘲笑HTTPBuilder這樣我就可以設置響應是在我的測試無論成功/失敗,所以我可以斷言,我的服務的isOk方法在響應成功時返回True,在響應失敗時返回False。

任何人都可以幫助我如何嘲笑HTTPBuilder請求並在GroovyTestCase中設置響應?

回答

10

這裏的模擬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場是真實的,它會調用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 
} 
+0

感謝您的答覆。我不明白什麼會將「結果」設置爲真/假。這不是更像是一個存根,而不是一個模擬? – C0deAttack 2012-02-01 19:04:44

+0

您必須在設置測試時自行設置結果。例如。 '新的MockHttpBuilder(結果:true)'。我添加了一個使用groovy嘲笑的替代方案。 – ataylor 2012-02-01 19:19:58

+0

Ataylor的回覆很好,我想到了幾乎相同的實現,只是我直接設置了響應狀態,然後使用它從映射中執行正確的閉包。然而,這真是存根嘲弄。我認爲正確的做法是嘲笑給予迴應的客戶。 – Gepsens 2012-06-25 16:08:49