Over a million developers have joined DZone.

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

Get the Edge with a Professional Java IDE. 30-day free trial.

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.

Get the Java IDE that understands code & makes developing enjoyable. Level up your code with IntelliJ IDEA. Download the free trial.

timeout ,java ,spock ,testing

Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

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

{{ parent.tldr }}

{{ parent.urlSource.name }}