Los bloques dividen un método en secciones. Comienzan con una etiqueta y se extienden ya sea al principio del siguiente bloque o al final del método. Ya usamos el dado, cuando y entonces, pero hay seis bloques en realidad:
- La configuración: (o su alias, dado:)
- cuando:
- entonces:
- esperar:
- limpieza:
- donde:
Configuración
En la configuración: o dado: (puede que la gente prefiera esto porque es más legible) bloquea la creación de los objetos y hace cualquier trabajo de configuración para la prueba. En realidad, este bloque es opcional puede estar implícito, cualquier cosa entre el principio del método y el primer bloque (diferente) representa el bloque de configuración:
12setup:def i =5
groovy
Si lo hay, sólo puede haber una configuración: o dado: bloqueo.
Cuándo y entonces
El cuando: y luego: los bloques siempre van juntos. Representan una causa (llamada estímulo ) y un efecto (o respuesta). Por esa razón, el bloque when: puede contener cualquier código pero then: sólo puede contener condiciones, definiciones o interacciones. Podemos tener múltiples pares de bloques del tipo cuándo-entonces:
1234567891011cuando:i = i *2then:i ==10cuando:i = i *2then:i ==20
groovy
O múltiples y luego bloques después de un cuando (que se evalúan por separado):
12345678cuando:i = i *2then:assert i !=5then:i ==10
groovy
Esperar
El bloque de espera es el mismo que el de entonces:, sólo puede contener condiciones o definiciones de variables, pero no requiere un bloque de entonces::
123expect:def i =5i *2==10
groovy
Limpieza
La limpieza opcional: el bloque se utiliza para liberar recursos y se ejecuta incluso si el código anterior al bloque ha lanzado una excepción. Normalmente es el último bloque del método, pero sólo puede ir seguido de un «where: block»:
1234567given:def file =newFile($0027/temp/1.txt$0027)//...cleanup:file.close()
groovy
Donde
where: es también un bloque opcional que debe ser el último porque permite definir valores para realizar pruebas parametrizadas, también conocidas como pruebas basadas en datos. Se usa comúnmente con expect::
12345678910def$0027data-driven test$0027(){espera: x + y == z donde: x | y | z 3|4|719|23|4271|12|83}
groovy
Spock hará tantas pruebas como filas en el bloque donde. En el ejemplo, Spock ejecutará tres pruebas, y los vares x, y, z se inicializarán con los siguientes valores:
- En la primera prueba, x será 3, y será 4, y z será 7.
- En la segunda prueba, x será 19, y será 23, y z será 42.
- En la tercera prueba, x será 71, y será 12, y z será 83.
El número mínimo de columnas para que esto funcione es de dos, así que si sólo tienes una variable, puedes hacer algo como esto:
12345donde:x |_3|_19||_71||||||||||||||de acuerdo a la ley de la selva. groovyLos datos también pueden ser formateados horizontalmente. De esta manera, las pruebas anteriores pueden ser escritas como:
123456789def$0027data-driven test$0027(){especto: x + y == z donde: x <<[3,19,71] y <<[4,23,12] z <<[7,42,83]}groovy
Un tubo de datos (representado por el operador del turno izquierdo, <<) conecta una variable a un proveedor de datos. En el ejemplo, los valores de cada variable son proporcionados por una lista, pero el proveedor de datos puede ser cualquier objeto iterable, como una Colección, una Cadena, u otras implementaciones de Iterable. Además, los datos pueden ser obtenidos de fuentes externas, como una base de datos:
12345678def$0027data-driven test$0027(){def sql = Sql.newInstance("jdbc:h2:mem:", "org.h2.Driver")//...where:[id, name, email]<< sql.rows("select id, name, email from table")}groovy
Los valores pueden ser ignorados con un guión bajo (_):
12345678def$0027data-driven test$0027(){def sql = Sql.newInstance("jdbc:h2:mem:", "org.h2.Driver")//...where:[_, name, email]<< sql.rows("select * from table")}groovy
Las variables también pueden asignarse directamente:
123456donde:x | y 3|419|2371|12z = x + ygroovy
Y por supuesto, puedes usar todos estos métodos al mismo tiempo:
1234567donde:x |_3|_19|_71||y <<[4,23,12]z = x + ygroovy
Y
Aunque no se considera un bloque, también hay una etiqueta "y" que puede ser añadida a cualquier bloque para describirlo y a una parte individual de él:
123456789def "escenario 1"(){dado: "Un entero con valor 5 "def i =5y: "Una cadena con valor a "def s ="a"// ...}groovy