我必須單元測試一個groovy類的方法,它使用sleep()來延遲循環中的處理。如何在groovy單元測試用例中模擬sleep()?
很顯然,我不希望我的測試套件,真正睡覺,所以我試圖嘲弄睡眠()調用在我的課:
MyClass.metaClass.sleep = { return }
我想這有一些變化,但沒有成功。
有人可以告訴我嘲笑這種語言方法的正確方法嗎?
我必須單元測試一個groovy類的方法,它使用sleep()來延遲循環中的處理。如何在groovy單元測試用例中模擬sleep()?
很顯然,我不希望我的測試套件,真正睡覺,所以我試圖嘲弄睡眠()調用在我的課:
MyClass.metaClass.sleep = { return }
我想這有一些變化,但沒有成功。
有人可以告訴我嘲笑這種語言方法的正確方法嗎?
你需要明確的參數,並匹配你明確覆蓋的方法。依靠默認的「it」參數不起作用。請注意,重寫靜態方法只能當我們規定的參數是一個「長」(這是一個靜態方法,而不是一個實例方法):
def s = ""
def firstCalled = false
def secondCalled = true
s.metaClass.static.sleep = { firstCalled = true }
assert firstCalled == false
s.metaClass.static.sleep = { long ms -> firstCalled = true }
assert secondCalled == true
您可以用接口將所有調用包裝到系統函數中。這樣你可以嘲笑任何你想要的方法。儘管如此,這確實會增加代碼的複雜性,所以你必須決定它是否值得。
該代碼可能調用Thread.sleep
不是嗎?
你可以這樣做:
Thread.metaClass.static.sleep = { long time -> println "Sleep for $time" }
但我不知道這是你想要的...
它實際上只是調用睡眠。從我可以告訴睡眠是一種靜態方法添加到所有常規對象,如下所示:http://groovy.codehaus.org/groovy-jdk/java/lang/Object.html#sleep%28long%29 - 我試過MyClass。 metaClass.static.sleep = {return}。 – Marek 2010-09-30 10:22:48
你每天都在學點東西! :-D – 2010-09-30 10:26:33
您是否嘗試過傳遞參數類型ie:'MyClass.metaClass.static.sleep = {long ms - > ms}'或者'Object.metaClass.static.sleep = {long ms - > ms}' – 2010-09-30 10:30:55
這個工作對我來說:
class Foo {
def longSleep() { sleep 10000000 }
}
Foo.metaClass.sleep = { int ms -> println "no sleep" }
new Foo().longSleep()
從tim_yates更新:睡眠(ms)被添加到Groovy JDK中的Object中。更多的信息在這裏:http://groovy.codehaus.org/groovy-jdk/java/lang/Object.html
是的,'睡眠'被添加到對象作爲靜態方便的方法,與'println'相同http://groovy.codehaus.org/groovy-jdk/java/lang/Object.html#sleep(long) – 2010-09-30 11:04:30
啊,就在那裏。我知道我曾經在某處看過它,但是昨天找不到它,而是看着GroovyObjectSupport。謝謝:) – xlson 2010-10-01 06:39:21
其他人給了這個解決方案,但不是明確的,所以我已經標記爲解決方案。我不知道這是我打算如何去做,但感謝大家的幫助。 – Marek 2010-09-30 13:47:49
這真的是你應該做的,我的意思是你應該把模擬睡眠方法放在實例的metaClass上,而不是類本身:) foo.metaClass.sleep = ...而不是Foo.metaClass。睡覺= ... – xlson 2010-10-01 06:44:23