我必须对一个groovy类的方法进行单元测试,该方法使用sleep()来延迟循环中的处理。
显然我不希望我的测试套件真的睡觉,所以我试着在我的课堂上模拟sleep()调用:
MyClass.metaClass.sleep = { return }
我尝试了一些这方面的变化但没有成功。
有人可以告诉我嘲笑这种语言方法的正确方法吗?
答案 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