Spocklight: Indicate Class Under Test with Subject Annotation
If we write a specification for a specific class we can indicate that class with the @Subject
annotation. This annotation is only for informational purposes, but can help in making sure we understand which class we are writing the specifications for. The annotation can either be used at class level or field level. If we use the annotation at class level we must specify the class or classes under test as argument for the annotation. If we apply the annotation to a field, the type of the field is used as the class under test. The field can be part of the class definition, but we can also apply the @Subject
annotation to fields inside a feature method.
In the following example Spock specification we write a specification for the class Greet
. The definition of the Greet
class is also in the code listing. We use the @Subject
annotation on the field greet
to indicate this instance of the Greet
class is the class we are testing here. The code also works with the @Subject
annotation, but it adds more clarity to the specification.
package com.mrhaki.spock
@Grab('org.spockframework:spock-core:0.7-groovy-2.0')
import spock.lang.*
// The @Subject annotation can also be applied at class level.
// We must specify the class or classes as arguments:
// @Subject([Greet])
class GreetSpec extends Specification {
// The greet variable of type Greet is the
// class we are testing in this specification.
// We indicate this with the @Subject annotation.
@Subject
private Greet greet = new Greet(['Hi', 'Hello'])
// Simple specification to test the greeting method.
def "greeting should return a random salutation followed by name"() {
when:
final String greeting = greet.greeting('mrhaki')
then:
greeting == 'Hi, mrhaki' || greeting == 'Hello, mrhaki'
}
}
/**
* Class which is tested in the above specification.
*/
@groovy.transform.Immutable
class Greet {
final List salutations
String greeting(final String name) {
final int numberOfSalutations = salutations.size()
final int selectedIndex = new Random().nextInt(numberOfSalutations)
final String salutation = salutations.get(selectedIndex)
"${salutation}, ${name}"
}
}
Code written with Spock 0.7-groovy-2.0 and Groovy 2.3.7.