2010-09-30 64 views
2

我必須單元測試一個groovy類的方法,它使用sleep()來延遲循環中的處理。如何在groovy單元測試用例中模擬sleep()?

很顯然,我不希望我的測試套件,真正睡覺,所以我試圖嘲弄睡眠()調用在我的課:

MyClass.metaClass.sleep = { return } 

我想這有一些變化,但沒有成功。

有人可以告訴我嘲笑這種語言方法的正確方法嗎?

回答

0

你需要明確的參數,並匹配你明確覆蓋的方法。依靠默認的「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 
+0

其他人給了這個解決方案,但不是明確的,所以我已經標記爲解決方案。我不知道這是我打算如何去做,但感謝大家的幫助。 – Marek 2010-09-30 13:47:49

+1

這真的是你應該做的,我的意思是你應該把模擬睡眠方法放在實例的metaClass上,而不是類本身:) foo.metaClass.sleep = ...而不是Foo.metaClass。睡覺= ... – xlson 2010-10-01 06:44:23

1

您可以用接口將所有調用包裝到系統函數中。這樣你可以嘲笑任何你想要的方法。儘管如此,這確實會增加代碼的複雜性,所以你必須決定它是否值得。

+0

這是一種選擇,但我真的不想增加我的代碼的複雜性,以便於測試,如果我可以幫助它。 – Marek 2010-09-30 10:23:27

+0

@Marek:正如指出[這裏](http://stackoverflow.com/questions/1007458/),這是編寫可測試代碼的結果。這其實並不是一件壞事。不過,這可能是你的情況矯枉過正。 – 2010-09-30 10:27:00

+0

我寫完後立即意識到它聽起來很糟糕。我同意你的看法,我只知道在這個特殊情況下會有更簡潔的方法來解決這個問題。 – Marek 2010-09-30 13:57:24

0

該代碼可能調用Thread.sleep不是嗎?

你可以這樣做:

Thread.metaClass.static.sleep = { long time -> println "Sleep for $time" } 

但我不知道這是你想要的...

+0

它實際上只是調用睡眠。從我可以告訴睡眠是一種靜態方法添加到所有常規對象,如下所示: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

+0

你每天都在學點東西! :-D – 2010-09-30 10:26:33

+0

您是否嘗試過傳遞參數類型ie:'MyClass.metaClass.static.sleep = {long ms - > ms}'或者'Object.metaClass.static.sleep = {long ms - > ms}' – 2010-09-30 10:30:55

0

這個工作對我來說:

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

+0

是的,'睡眠'被添加到對象作爲靜態方便的方法,與'println'相同http://groovy.codehaus.org/groovy-jdk/java/lang/Object.html#sleep(long) – 2010-09-30 11:04:30

+0

啊,就在那裏。我知道我曾經在某處看過它,但是昨天找不到它,而是看着GroovyObjectSupport。謝謝:) – xlson 2010-10-01 06:39:21