2015-01-06 10 views
6

Ich verwende Traits, um meine Controller DRY zu machen. Ich möchte die Trait-Klasse mit Spock testen. Hier ist meine Probe Zu und Spock Testfall jeweils:Wie schreibe ich einen Spock-Unit-Testfall für Merkmale in Grallen 2.4?

trait SomeTrait { 
    public void checkSomething (Closure c){ 
     // Do some operation 
     c.call 
    } 
} 

@TestMixin(GrailsUnitTestMixin) 
class SomeTraitSpec extends Specification { 
    void "test checkSomething "(){ 
     setup: 
     MockedClass mockedObj = new MockedClass() 
     def x=0 
     def c = { 
      x=1 
     } 

     when: 
     mockedObj.checkSomething(c) 

     then: 
     assert x==1 
    } 
} 
class MockedClass implements PermissionTrait { 
    // some thing 
    } 

Da Merkmal eine Schnittstelle ist, habe ich eine Mocked Klasse in meinem Testfall, der die Trait implementiert, erstelle ich ein Objekt dieser Mocked Klasse und rufen Sie meine Trait-Methode, die ich testen möchte. Ist das die richtige Herangehensweise, wenn nicht, bitte mit einem geeigneten Beispiel in die richtige Richtung zeigen.

+0

Hat jemand eine solche Situation erlebt? –

Antwort

7

Die Groovy-Typenzerrung kann verwendet werden, um zur Laufzeit Verhalten einer Eigenschaft einer Klasse hinzuzufügen.

class MyTraitSpec extends Specification 
{ 
    @Shared 
    MyTrait testInstance = new Object() as MyTrait 

    // ... 
} 

Sie sollten sich bewusst sein, dass dies eine Proxy-Instanz erstellt, obwohl die Dokumentation (http://docs.groovy-lang.org/docs/groovy-2.3.0/html/documentation/core-traits.html#_runtime_implementation_of_traits) sagt der Proxy das Merkmal implementieren garantiert und jegliche/alle Schnittstellen, könnte dies zu Problemen führen, wenn Sie jemals die Kontrolle sind konkreter Typ des Objekts.