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:: Combina when: i then: 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.

© Copyright 2024. Tots els drets reservats