如何在groovy单元测试用例中模拟sleep()?

如何在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 
+0

其他人给了这个解决方案,但不是明确的,所以我已经标记为解决方案。我不知道这是我打算如何去做,但感谢大家的帮助。 – Marek 2010-09-30 13:47:49

+1

这真的是你应该做的,我的意思是你应该把模拟睡眠方法放在实例的metaClass上,而不是类本身:) foo.metaClass.sleep = ...而不是Foo.metaClass。睡觉= ... – xlson 2010-10-01 06:44:23

您可以用接口将所有调用包装到系统函数中。这样你可以嘲笑任何你想要的方法。尽管如此,这确实会增加代码的复杂性,所以你必须决定它是否值得。

+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

该代码可能调用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

这个工作对我来说:

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