El framework de proves Spock és una eina poderosa i innovadora per a la realització de proves en aplicacions Groovy i Java. Spock combina les millors característiques de JUnit, Mockito i altres frameworks de proves, proporcionant una sintaxi clara i expressiva que facilita la creació i manteniment de proves.
Continguts
Introducció a Spock
Spock és un framework de proves per a aplicacions Groovy i Java que destaca per la seva sintaxi de DSL (Domain-Specific Language) i la seva capacitat per realitzar proves unitàries, d'integració i de comportament.
Característiques Clau de Spock
- Sintaxi Expressiva: Utilitza una DSL que fa que les proves siguin fàcils de llegir i escriure.
- Integració amb JUnit: Es pot utilitzar conjuntament amb JUnit, permetent una transició suau des de JUnit.
- Suport per a Mocking i Stubbing: Inclou funcionalitats integrades per a la creació de mocks i stubs.
- Proves de Comportament: Permet escriure proves de comportament de manera clara i concisa.
Configuració de Spock
Per començar a utilitzar Spock, primer hem de configurar el nostre projecte. A continuació es mostra com afegir Spock a un projecte Gradle.
Configuració de Gradle
Afegiu les següents dependències al fitxer build.gradle:
dependencies {
testImplementation 'org.spockframework:spock-core:2.0-groovy-3.0'
testImplementation 'org.spockframework:spock-spring:2.0-groovy-3.0' // Si utilitzeu Spring
testImplementation 'org.codehaus.groovy:groovy-all:3.0.7'
}Configuració de Maven
Si utilitzeu Maven, afegiu les següents dependències al fitxer pom.xml:
<dependencies>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>2.0-groovy-3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-spring</artifactId>
<version>2.0-groovy-3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>3.0.7</version>
<scope>test</scope>
</dependency>
</dependencies>Estructura d'una Prova Spock
Una prova Spock es compon de diverses seccions que fan que el codi sigui fàcil de llegir i mantenir. A continuació es mostra un exemple bàsic d'una prova Spock:
import spock.lang.Specification
class CalculatorSpec extends Specification {
def "sumar dos nombres"() {
given: "una calculadora"
def calculator = new Calculator()
when: "sumem dos nombres"
def result = calculator.add(2, 3)
then: "el resultat és correcte"
result == 5
}
}Seccions d'una Prova Spock
given:: Configura l'estat inicial del test.when:: Descriu l'acció que es realitza.then:: Verifica el resultat de l'acció.expect:: Combinawhen:ithen:en una sola secció per a proves simples.cleanup:: Realitza qualsevol neteja necessària després de la prova.
Proves de Comportament
Spock és ideal per a proves de comportament, ja que permet descriure les expectatives de manera clara i concisa. A continuació es mostra un exemple de prova de comportament:
class UserServiceSpec extends Specification {
def userService = new UserService()
def "crear un nou usuari"() {
given: "un nou usuari"
def user = new User(name: "John Doe", email: "john.doe@example.com")
when: "l'usuari es crea"
userService.createUser(user)
then: "l'usuari es guarda correctament"
1 * userService.save(user)
}
}Mocking i Stubbing amb Spock
Spock proporciona funcionalitats integrades per a la creació de mocks i stubs, facilitant la simulació de comportaments i la verificació d'interaccions.
Exemple de Mocking
class UserServiceSpec extends Specification {
def userRepository = Mock(UserRepository)
def userService = new UserService(userRepository)
def "guardar un usuari"() {
given: "un nou usuari"
def user = new User(name: "John Doe", email: "john.doe@example.com")
when: "l'usuari es guarda"
userService.saveUser(user)
then: "el repositori guarda l'usuari"
1 * userRepository.save(user)
}
}Exercicis Pràctics
Exercici 1: Prova de Suma
Escriu una prova Spock per a una classe Calculator que tingui un mètode add que sumi dos nombres.
Solució
class CalculatorSpec extends Specification {
def "sumar dos nombres"() {
given: "una calculadora"
def calculator = new Calculator()
when: "sumem dos nombres"
def result = calculator.add(2, 3)
then: "el resultat és correcte"
result == 5
}
}Exercici 2: Mocking d'un Repositori
Escriu una prova Spock per a una classe UserService que utilitzi un mock de UserRepository per verificar que el mètode save es crida correctament.
Solució
class UserServiceSpec extends Specification {
def userRepository = Mock(UserRepository)
def userService = new UserService(userRepository)
def "guardar un usuari"() {
given: "un nou usuari"
def user = new User(name: "John Doe", email: "john.doe@example.com")
when: "l'usuari es guarda"
userService.saveUser(user)
then: "el repositori guarda l'usuari"
1 * userRepository.save(user)
}
}Conclusió
El framework de proves Spock és una eina poderosa i flexible per a la realització de proves en aplicacions Groovy i Java. La seva sintaxi expressiva i les seves funcionalitats integrades per a mocking i stubbing fan que sigui una opció excel·lent per a qualsevol projecte. Amb els coneixements adquirits en aquesta secció, hauríeu de ser capaços de començar a escriure proves efectives i mantenibles utilitzant Spock.
Curs de Programació Groovy
Mòdul 1: Introducció a Groovy
Mòdul 2: Sintaxi i Característiques del Llenguatge Groovy
Mòdul 3: Programació Orientada a Objectes en Groovy
Mòdul 4: Característiques Avançades de Groovy
Mòdul 5: Groovy en la Pràctica
- Entrada/Sortida de Fitxers
- Treballant amb XML i JSON
- Accés a Bases de Dades
- Desenvolupament Web amb Groovy
Mòdul 6: Proves i Depuració
Mòdul 7: Ecosistema i Eines de Groovy
- Eina de Construcció Gradle
- Framework de Proves Spock
- Framework Grails
- Altres Llibreries i Eines de Groovy
Mòdul 8: Millors Pràctiques i Temes Avançats
- Estil de Codi i Convencions
- Optimització del Rendiment
- Consideracions de Seguretat
- Concurrència en Groovy
