Spocklight: Set Timeout on Specification Methods [Snippet]

DZone 's Guide to

Spocklight: Set Timeout on Specification Methods [Snippet]

If you use Spock for testing, you should familiarize yourself with the various options you have for timeouts and how to customize your settings for specification methods.

· Java Zone ·
Free Resource

When we write a feature method in our Spock specification to test our class, we might run into long-running methods that are invoked. We can specify a maximum time we want to wait for a method. If the time spent by the method is more than the maximum time, our feature method must fail. Spock has the @Timeout annotation to define this. We can apply the annotation to our specification or to feature methods in the specification. We specify the timeout value as an argument for the @Timeout annotation. Seconds are the default time unit that is used. If we want to specify a different time unit, we can use the annotation argument unit and use constants from java.util.concurrent.TimeUnit to set a value.

In the following example specification, we set a general timeout of 1 second for the whole specification. For two methods, we override this default timeout with their own value and unit:

package mrhaki.spock

import spock.lang.Specification
import spock.lang.Subject
import spock.lang.Timeout

import static java.util.concurrent.TimeUnit.MILLISECONDS

// Set a timeout for all feature methods.
// If a feature method doesn't return in 1 second
// the method fails.
class SampleSpec extends Specification {

    private final Sample sample = new Sample()

    // Check that method will return within 1 second.
    void 'timeout will not happen'() {
        sample.run(500) == 'Awake after 500 ms.'

    // Method will fail, because it doesn't return in 1 second.
    void 'method under test should return in 1 second'() {
        sample.run(1500) == 'Awake after 1500 ms.'

    // We can change the timeout value and 
    // the unit. The unit type is 
    // java.util.concurrent.TimeUnit.
    @Timeout(value = 200, unit = MILLISECONDS)
    void 'method under test should return in 200 ms'() {
        sample.run(100) == 'Awake after 100 ms.'

    // Method will fail.
    @Timeout(value = 100, unit = MILLISECONDS)
    void 'method under test should return in 100 ms'() {
        sample.run(200) == 'Awake after 200 ms.'


// Simple class for testing.
class Sample {
     * Run method and sleep for specified timeout value.
     * @param timeout Sleep number of milliseconds specified
     *                by the timeout argument.
     * @return String value with simple message.
    String run(final Long timeout) {
        "Awake after $timeout ms."

Written with Spock 1.0-groovy-2.4.

java, spock, testing, timeout

Published at DZone with permission of Hubert Klein Ikkink , DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}