2014-12-15 44 views
9

Po prostu próbowałem napisać ten prosty kod, aby przetestować nadpisywanie metod za pomocą metaClass.Groovy metaClass kończy się niepowodzeniem podczas przesłonięcia metody wywołanej w konstruktorze?

Kod jest tutaj:

class Hello { 

    public Hello() 
    { 
     Foo() 
    } 

    public void Foo() 
    { 
     println "old" 
    }  

} 

Ma metodę Foo(), która po prostu drukuje „starych” i był nazywany przez konstruktora.

Oto kod testu:

class HelloTest { 

    @Test 
    public void test() { 

     boolean methodFooWasCalled = false 

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

     Hello hello = new Hello() 

     assertTrue methodFooWasCalled == true 

    } 
} 

Spodziewałem się, że wyjście powinno być „nowy”, ponieważ Foo() zostało nadpisane. Ale nadal drukowane "stare". Czy ktoś wie, dlaczego się nie udaje? Dzięki

Odpowiedz

4

następujące utwory:

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

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

new Hello() 

i tak nie następujące elementy:

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

    void Foo() { println "old" } 
} 

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

new Hello() 

Ten jest interesujący; bar() połączenia wewnątrz Foo() robót budowlanych, podczas gdy te, które wewnątrz konstruktora nie:

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() 

Wydaje Groovy nie najpierw sprawdzić metody metaklasa, gdy na konstruktorów. Myślę, że to błąd i nie mogłem znaleźć żadnego błędu związanego z tym. A co z wypełnianiem JIRA?

+0

Tak, to wygląda na błąd. Złożyłem problem z JIRA. Dziękuję za Twoją odpowiedź! – danielZ

+0

Mam ten sam problem, próbując zmienić metodę init(), która jest wywoływana z konstruktora. Czy możesz wskazać mi, proszę, kwestię JIRA? Thx –

+0

https://issues.apache.org/jira/browse/GROOVY-7209 – mhsmith