2014-12-15 6 views
9

Ho appena provato a scrivere questo semplice codice per testare i metodi di overriding con metaClass.La metaClass di Groovy non riesce quando il metodo di overriding viene chiamato nel costruttore?

Il codice è qui:

class Hello { 

    public Hello() 
    { 
     Foo() 
    } 

    public void Foo() 
    { 
     println "old" 
    }  

} 

Ha un metodo di Foo(), che stampa semplicemente "vecchio" ed è stato chiamato dal costruttore.

Ecco il codice di prova:

class HelloTest { 

    @Test 
    public void test() { 

     boolean methodFooWasCalled = false 

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

     Hello hello = new Hello() 

     assertTrue methodFooWasCalled == true 

    } 
} 

mi aspettavo che l'uscita dovrebbe essere "nuovo" in quanto Foo() è stato sovrascritto. Ma è ancora stampato "vecchio". Qualcuno sa perché fallisce? Grazie

risposta

4

le seguenti opere:

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

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

new Hello() 

e così fa il seguente:

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

    void Foo() { println "old" } 
} 

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

new Hello() 

Questo è interessante; il bar() chiamata all'interno Foo() opere, mentre quelli all'interno il costruttore non lo fa:

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

Sembra Groovy non controlla metodi metaclasse PRIMO quando in costruttori. Penso che sia un bug, e non ho trovato alcun bug relativo a questo. Che ne dici di riempire un JIRA?

+0

Sì, sembra un bug. Ho presentato un problema JIRA. La ringrazio per la risposta! – danielZ

+0

Ho lo stesso problema, provando a cambiare il metodo init(), che viene chiamato dal costruttore. Puoi indicarmi la questione JIRA? Thx –

+0

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