In a Spock specification we write our assertion in the then: or expect: blocks. If we need to write multiple assertions for an object we can group those with the with method. We specify the object we want write assertions for as argument followed by a closure with the real assertions. We don't need to use the assert keyword inside the closure, just as we don't have to use the assert keyword in an expect: or then: block.
In the following example specification we have a very simple implementation for finding an User object. We want to check that the properties username and name have the correct value.
@Grab("org.spockframework:spock-core:1.0-groovy-2.4")
import spock.lang.Specification
import spock.lang.Subject
class UserServiceSpec extends Specification {
@Subject
private UserService userService = new DefaultUserService()
def "check user properties"() {
when:
final User user = userService.findUser("mrhaki")
then:
// Assert each property.
user.username == "mrhaki"
user.name == "Hubert A. Klein Ikkink"
}
def "check user properties using with()"() {
when:
final User user = userService.findUser("mrhaki")
then:
// Assert using with().
with(user) {
username == "mrhaki"
name == "Hubert A. Klein Ikkink"
}
}
def "check expected user properties using with()"() {
expect:
with(userService.findUser("mrhaki")) {
username == "mrhaki"
name == "Hubert A. Klein Ikkink"
}
}
}
interface UserService {
User findUser(final String username)
}
class DefaultUserService implements UserService {
User findUser(final String username) {
new User(username: "mrhaki", name: "Hubert A. Klein Ikkink")
}
}
class User {
String username
String name
}
Written with Spock 1.0.