We can use data pipes to write data driven tests in Spock. A data pipe (<<
) is fed by a data provider. We can use Collection
objects as data provider, but also String
objects and any class that implements the Iterable
interface. We can write our own data provider class if we implement the Iterable
interface.
In the following sample code we want to test the female
property of the User
class. We have the class MultilineProvider
that implements the Iterable
interface. The provider class accepts a multiline String
value and returns the tokenized result of each line in each iteration.
Continue reading →
We can write data driven tests with Spock. We can specify for example a data table or data pipes in a where:
block. If we use a data pipe we can specify a data provider that will return the values that are used on each iteration. If our data provider returns multiple results for each row we can assign them immediately to multiple variables. We must use the syntax [var1, var2, var3] << providerImpl
to assign values to the data variables var1
, var2
and var3
. We know from Groovy the multiple assignment syntax with parenthesis ((var1, var2, var3)
), but with Spock we use square brackets.
In the following sample specification we have a simple feature method. The where:
block shows how we can assign the values from the provider to multiple data variables. Notice we can skip values from the provider by using a _
to ignore the value.
Continue reading →
We can use the @Ignore
and @IgnoreRest
annotation in our Spock specifications to not run the annotated specifications or features. With the @IgnoreIf
annotation we can specify a condition that needs to evaluate to true
to not run the feature or specification. The argument of the annotation is a closure. Inside the closure we can access three extra variables: properties
(Java system properties), env
(environment variables) and javaVersion
.
In the following Spock specification we have a couple of features. Each feature has the @IgnoreIf
annotation with different checks. We can use the extra variables, but we can also invoke our own methods in the closure argument for the annotation:
Continue reading →
Spock's unroll feature is very powerful. The provider data variables can be used in the method description of our specification features with placeholders. For each iteration the placeholders are replaced with correct values. This way we get a nice output where we immediately can see the values that were used to run the code. Placeholders are denoted by a hash sign (#
) followed by the variable name. We can even invoke no-argument methods on the variable values or access properties. For example if we have a String value we could get the upper case value with #variableName.toUpperCase()
. If we want to use more complex expressions we must introduce a new data variable in the where
block. The value of the variable will be determined for each test invocation and we can use the result as a value in the method description.
package com.mrhaki.spock
import spock.lang.*
class SampleSpec extends Specification {
@Unroll
def "check if '#value' is lower case"() {
expect:
value.every { (it as char).isLowerCase() } == result
where:
value || result
'A' || false
'Ab' || false
'aB' || false
'a' || true
'ab' || true
}
}
Continue reading →
Gr8Conf 2014 in Copenhagen has been great.
Three days filled with very informative talks, learning the latest from the Groovy community and mostly meeting all the people involved with the Groovy community, both project leads, members and users.
As always the first day of the conference is a university day with workshops that take 3 hours.
This format is more of a hands-on experience.
The day started with a Getting Groovy workshop to learn Groovy and play around with the language given by myself (Hubert Klein Ikkink).
Notes and the presentation can be found at Github.
The following session we attended was Creating RESTful API's with Grails and Spring Security by Alvaro Sanchez-Mariscal.
After some startup problems, we were running out of time, so he did a live coding session.
Where a rest service was created and login functionality added.
I got some good ideas for our upcoming rest workshop.
The final session of the day was really about playing: Getting Groovy With Lego Mindstorms EV3 by Ryan Vanderwerf.
Ryan gave a small introduction about leJOS as an operating system for the Mindstorm computers, capable of running Java code.
But we can also use Groovy and run the compiled classes on a Mindstorm computer.
It is good to use the @CompileStatic
annotation, because otherwise the application will be to slow to run.
After the introduction Ryan had five Mindstorm sets we could play with.
It was fun to write little code snippets with actions for the Mindstorm 'robot' to execute and then upload them to the Mindstorm computer and see the results.
This was really fun and the Groovy support can be even extended by including builders for instruction.
The project is open source and we can all contribute.
Code from the talk is available at Github.
At the same time the workshop about Unleashing the power of AST transformations by Cédric Champeau started.
The great thing about AST transformations is that you can change the bytecode, so non-groovy languages can use it.
There are multiple phases where you can use your transformation, depending on what you want.
These were some hard exercises.
Homework! The workshop is also available online.
Continue reading →