我在测试设置中有以下内容:
def originalPostAsXml = RestClient.&postAsXml
RestClient.metaClass.'static'.postAsXml = {
String uriPath, String xml ->
return 65536
}
并在测试清理中:
RestClient.metaClass.'static'.postAsXml = originalPostAsXml
但是,当下一个测试运行时,当它尝试执行RestClient.postAsXml时,它将运行到StackOverflowError中:
at groovy.lang.Closure.call(Closure.java:282)
看起来RestClient.postAsXml递归指向自己。重置模拟出的静态方法的正确方法是什么?
最佳答案
在单元测试中,我经常在null
中将元类设置为tearDown()
,这似乎允许该类像最初那样工作而无需修改。
例子:
void setUp() {
super.setUp()
ServerInstanceSettings.metaClass.'static'.list = {
def settings = [someSetting:'myOverride'] as ServerInstanceSettings
return [settings]
}
}
void tearDown() {
super.tearDown()
ServerInstanceSettings.metaClass.'static'.list = null
}
如果您使用的是JUnit4,则在这种情况下可以使用
@AfterClass
代替,这也许更有意义。关于groovy - 如何在Groovy中重置模拟的静态方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8349077/