Spocklight: Support for Hamcrest Matchers
Join the DZone community and get the full member experience.
Join For FreeSpock has support for Hamcrest matchers and adds some extra syntactic sugar. In an expect:
block in a Spock specification method we can use the following syntax value Matcher. Let's create a sample Spock specification and use this syntax with the Hamcrest matcher hasKey
:
// File: SampleSpecification.groovy package com.mrhaki.spock @Grab('org.hamcrest:hamcrest-all:1.3') import static org.hamcrest.Matchers.* @Grab('org.spockframework:spock-core:0.7-groovy-2.0') import spock.lang.Specification class SampleSpecification extends Specification { def "sample usage of hamcrest matcher hasKey"() { given: final sampleMap = [name: 'mrhaki'] expect: sampleMap hasKey('name') sampleMap not(hasKey('name')) // To show assertion message. } }
We can run the code ($groovy SampleSpecification.groovy
) and see in the output a very useful assertion message for the second matcher in the expect:
block. We directly see what went wrong and what was expected.
$ groovy SampleSpecification.groovy JUnit 4 Runner, Tests: 1, Failures: 1, Time: 210 Test Failure: sample usage of hamcrest matcher hasKey(com.mrhaki.spock.SampleSpecification) Condition not satisfied: sampleMap not(hasKey('name')) | | | false [name:mrhaki] Expected: not map containing ["name"->ANYTHING] but: was <{name=mrhaki}> at com.mrhaki.spock.SampleSpecification.sample usage of hamcrest matcher hasKey(SampleSpecification.groovy:18)
With Spock we can rewrite the specification and use the static method that()
in spock.util.matcher.HamcrestSupport
as a shortcut for the Hamcrest assertThat()
method. The following sample shows how we can use that()
. With this method we can use the assertion outside an expect:
or then:
block.
// File: SampleSpecification.groovy package com.mrhaki.spock @Grab('org.hamcrest:hamcrest-all:1.3') import static org.hamcrest.Matchers.* @Grab('org.spockframework:spock-core:0.7-groovy-2.0') import static spock.util.matcher.HamcrestSupport.* import spock.lang.Specification class SampleSpecification extends Specification { def "sample usage of hamcrest matcher hasKey"() { given: final sampleMap = [name: 'mrhaki'] expect: that sampleMap, hasKey('name') } }
Finally we can use the expect()
method in spock.util.matcher.HamcrestSupport
to add the assertion in a then:
block. This improves readability of our specification.
// File: SampleSpecification.groovy package com.mrhaki.spock @Grab('org.hamcrest:hamcrest-all:1.3') import static org.hamcrest.Matchers.* @Grab('org.spockframework:spock-core:0.7-groovy-2.0') import static spock.util.matcher.HamcrestSupport.* import spock.lang.Specification class SampleSpecification extends Specification { def "sample usage of hamcrest matcher hasKey"() { when: final sampleMap = [name: 'mrhaki'] then: expect sampleMap, hasKey('name') } }
Code written with Spock 0.7-groovy-2.0
Published at DZone with permission of Hubert Klein Ikkink, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments