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: "[email protected]") 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: "[email protected]") 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: "[email protected]") 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