下面的測試類驗證一個簡單的HttpService從給定的URL獲取內容。所顯示的兩個實現都使測試通過,但顯然這是錯誤的,因爲它構造的URL的參數不正確。Groovy:驗證存根URL的構造
爲了避免這種情況並正確指定我想要的行爲,我想驗證在測試用例的使用塊中,我構造了一個(且只有一個)URL類實例,並且url
參數到構造函數是正確的。 A Groovy enhancement似乎將讓我添加語句
mockURLContext.demand.URL { assertEquals "http://www.foo.com", url }
,但我可以做什麼,而不在於Groovy的增強?
更新:在標題中用「存根」代替「模擬」,因爲我只想檢查狀態,而不一定是相互作用的細節。 Groovy有一個我沒有用過的StubFor機制,所以我將保留原來的代碼,但我認爲你可以在整個過程中用StubFor代替MockFor。
import grails.test.*
import groovy.mock.interceptor.MockFor
class HttpServiceTests extends GrailsUnitTestCase {
void testGetsContentForURL() {
def content = [text : "<html><body>Hello, world</body></html>"]
def mockURLContext = new MockFor(URL.class)
mockURLContext.demand.getContent { content }
mockURLContext.use {
def httpService = new HttpService()
assertEquals content.text, httpService.getContentFor("http://www.foo.com")
}
}
}
// This is the intended implementation.
class HttpService {
def getContentFor(url) {
new URL(url).content.text
}
}
// This intentionally wrong implementation also passes the test!
class HttpService {
def getContentFor(url) {
new URL("http://www.wrongurl.com").content.text
}
}
嗯。我遵循他的問題,但不是你的回答。他試圖模擬URL類,而不是他的HTTPService。 HTTPService是被測試的代碼。 – cwash 2009-06-23 21:07:46
我刪除了部分評論。我問這個問題的原因是因爲我無法告訴原始海報試圖用這裏提供的代碼和描述來完成什麼。我提供的代碼將通過預期會通過的情況,並使預計失敗的情況失敗。它真的證明了什麼? – laz 2009-06-23 21:28:05
這是一個簡單的例子,但是展示了基於狀態測試的一些微妙之處。他試圖驗證的是他的模擬設置正確。在大多數嘲諷框架中,這是通過設定預期參數集的預期值來完成的。在這裏,他試圖將參數的期望值設置給構造函數,但由於他提到的增強而無法實現。 – cwash 2009-06-23 21:39:54