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