如何在groovy单元测试用例中模拟sleep()?
我必须单元测试一个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