Search

Dark theme | Light theme

September 4, 2015

Spocklight: Only Run Specs Based On Conditions

In a previous blog post we have seen the IgnoreIf extension. There is also a counterpart: the Requires extension. If we apply this extension to a feature method or specification class than the method or whole class is executed when the condition for the @Requires annotation is true. If the condition is false the method or specification is not executed. As a value for the @Requires annotation we must specify a closure. In the closure Spock adds some properties we can use for our conditions:

  • jvm can be used to check a Java version or compatibility.
  • sys returns the Java system properties.
  • env used to access environment variables.
  • os can be used to check for operating system names.
  • javaVersion has the Java version as BigDecimal, eg. 1.8.

In the following example we use the @Requires annotation with different conditions:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.mrhaki.spock
 
import spock.lang.Requires
import spock.lang.Specification
 
class RequiresSampleSpec extends Specification {
 
    @Requires({ Boolean.valueOf(sys['spock.longRunning']) })
    def "run spec if Java system property 'spock.longRunning' is true"() {
        expect:
        true
    }
 
    @Requires({ Boolean.valueOf(env['SPOCK_LONG_RUNNING']) })
    def "run spec if environment variable 'SPOCK_LONG_RUNNING' is true"() {
        expect:
        true
    }
 
    @Requires({ javaVersion >= 1.7 })
    def "run spec if run in Java 1.7 or higher"() {
        expect:
        true
    }
 
    @Requires({ jvm.isJava8() })
    def "run spec if run in Java 1.8"() {
        expect:
        true
    }
 
    @Requires({ os.isWindows() })
    def "run only if run on windows operating system"() {
        expect:
        true
    }
 
}

If we have the same condition to be applied for all feature methods in a specification we can use the @Requires annotation at the class level:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.mrhaki.spock
 
import spock.lang.Requires
import spock.lang.Specification
 
@Requires({ jvm.isJava7Compatible() })
class RequiresSpec extends Specification {
 
    def "all feature methods run only if JVM is Java 7 compatible"() {
        expect:
        true
    }
 
}

Written with Spock 1.0-groovy-2.4.