groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Dinko Srko─Ź <dinko.sr...@gmail.com>
Subject Re: Metaclass programming and Groovy (2.3.7) traits
Date Mon, 20 Jul 2015 08:30:09 GMT
On 17 July 2015 at 19:23, Sean LeBlanc <sean.leblanc@icd-tech.com> wrote:
> I'm trying to figure out the recommended way to write unit tests for classes
> that have methods implemented as traits that need to be overwritten with
> metaclass programming.

If what you needed is just overriding trait's methods, you could do it
with another trait, without resorting to metaclass fiddling:

  trait T {
      def speak() {
          println "trait version"
      }
  }

  class C implements T {}

  trait T2 {
      def speak() {
          println "another trait"
      }
  }

  def c = new C().withTraits T2
  c.speak() // prints "another trait"

Cheers,
Dinko

>
>
> What I've noticed is that using an instance of the class doesn't seem to
> work, nor does using the class itself. (Commented out below)
>
> It seems that setting is on the trait itself does work, however, this must
> be done before the first time the implementing class is created, or else
> setting the metaClass to null on the implementing class is required (also
> commented out below)?
>
>
> Is there a better way to do this?
>
>
> trait T {
>   def speak() {
>      println "trait version"
>   }
> }
>
> class C implements T {
> }
>
> def c = new C()
> //c.metaClass.speak = { -> println "meta" }
> //C.metaClass.speak = { -> println "meta" }
>
> c.speak()
> //C.metaClass = null
>
> T.metaClass.speak = { println "meta class version" }
> def c2 = new C()
> c2.speak()

Mime
View raw message