我在测试设置中有以下内容:

    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/

10-09 04:20