Spock 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