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

时间:2010-09-30 09:41:53

标签: unit-testing groovy

我必须对一个groovy类的方法进行单元测试,该方法使用sleep()来延迟循环中的处理。

显然我不希望我的测试套件真的睡觉,所以我试着在我的课堂上模拟sleep()调用:

MyClass.metaClass.sleep = { return }

我尝试了一些这方面的变化但没有成功。

有人可以告诉我嘲笑这种语言方法的正确方法吗?

4 个答案:

答案 0 :(得分:1)

您可以使用接口将所有调用包装到系统函数中。这样您就可以模拟对任何方法的调用。这确实会增加代码复杂性,因此您必须决定它是否值得。

答案 1 :(得分:0)

代码可能会调用Thread.sleep不是吗?

你可以这样做:

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

但我不确定这是你想要的......

答案 2 :(得分:0)

这对我有用:

class Foo {
    def longSleep() { sleep 10000000 }   
}

Foo.metaClass.sleep = { int ms -> println "no sleep" }
new Foo().longSleep()

从tim_yates更新:sleep(ms)被添加到Groovy JDK中的Object。更多信息:http://groovy.codehaus.org/groovy-jdk/java/lang/Object.html

答案 3 :(得分:0)

您需要在参数中明确,并匹配您明确覆盖的方法。依赖于默认的“it”参数不起作用。请注意,覆盖静态方法仅在我们声明参数为“long”(并且它是静态方法,而不是实例方法)时才起作用:

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