当重写在构造函数中调用的方法时,Groovy metaClass失败了吗?

时间:2014-12-15 17:37:11

标签: unit-testing groovy mocking metaclass

我只是尝试编写这个简单的代码来测试使用metaClass的覆盖方法。

代码在这里:

class Hello {

    public Hello()  
    {
        Foo()
    }

    public void Foo()
    {
        println "old"   
    }       

}

它有一个Foo()方法,只打印“old”,它由构造函数调用。

这是测试代码:

class HelloTest {

    @Test
    public void test() {

        boolean methodFooWasCalled = false

        Hello.metaClass.Foo = {-> println "new"
            methodFooWasCalled = true
        }

        Hello hello = new Hello()

        assertTrue methodFooWasCalled == true

    }
}

我期待输出应该是“新的”,因为Foo()已被覆盖。但它仍然印有“旧”字样。有谁知道它失败的原因?谢谢

1 个答案:

答案 0 :(得分:4)

以下作品:

class Hello {
  Hello() {
    Foo()
  }
}

Hello.metaClass.Foo = {-> 
  println "new"
}

new Hello()

以下内容如下:

class Hello {
  Hello() {
    invokeMethod('Foo', [] as Object[])
  }

  void Foo() { println "old" }
}

Hello.metaClass.Foo = {-> 
  println "new"
}

new Hello()

这个很有趣; bar()内的Foo()调用有效,而构造函数内的调用则不起作用:

class Hello {
  Hello() {
    Foo()
    bar()
  }

  void Foo() { println "old foo"; bar() }
  void bar() { println "old bar" }
}

Hello.metaClass {
  Foo = {-> println "new foo" }
  bar = { println "new bar" }
}

new Hello()

看起来Groovy在构造函数上没有检查元类'方法FIRST。我认为这是一个错误,我找不到任何与此相关的错误。如何填写JIRA