2013-12-20 6 views
5

Groovy generates getters and setters für alle Felder Ihrer Klasse. Also, wenn Sie dies tun:Spock Aufruf für Groovy generierte Getter mit einem Endfeld

class Foo { 
    final bar 
} 
new Foo().bar 

Sie tatsächlich die erzeugte Methode Foo.getBar() aufrufen.

Ich habe eine Spock-Spezifikation, die Anrufungen eines solchen erzeugt Getter überprüfen mag:

def "some spock test"() { 
    given: def fooMock = Mock(Foo) 
    when: someFunction(fooMock) 
    then: 1 * fooMock.getBar() 
} 

someFunction() tut fooMock.bar aber ich bekomme immer

Too few invocations for: 
1 * fooMock.getBar() (0 invocations) 

1 * fooMock.bar funktioniert auch nicht. Wie kann ich überprüfen, ob bar im Test von Foo gelesen wird? Es funktioniert, wenn ich final weglasse, aber das ist eine beschissene Lösung ...

Antwort

8

Für eine final Eigenschaft erzeugt Groovy eine final Getter-Methode. Testdoppelwerte, die mit Mock(), Stub() oder Spy() erstellt wurden, sind jedoch rein proxybasiert und können daher keine finalen Methoden abfangen.

Da der zu testende Code in Groovy geschrieben ist, können Sie stattdessen GroovyMock() verwenden, was das Problem löst.

PS: Sowohl 1 * foo.getBar() als auch 1 * foo.bar sind gültige Notationen.

PPS: Nur GroovyMock() über Mock() bevorzugen, wenn Sie einen konkreten Grund haben (verspotten eine endgültige Methode, eine dynamische Methode verspotten, etc.). Einzelheiten finden Sie unter reference documentation.

+0

perfekte Antwort - danke –