Maven + Spock 2.X: Konfiguracja projektu od zera

Maven + Spock 2.X: Konfiguracja projektu od zera

Rosnąca popularność BDD (Behavior Driven Development) sprawia, że coraz więcej programistów decyduje się zaprzęgnąć do swoich testów Spocka. Jeśli nie miałeś jeszcze okazji zapoznać się z tym frameworkiem testowym, zachęcam aby to zrobić, ponieważ w niektórych aspektach jest dużo lepszy od standardowego JUnit 5. Być może akurat te różnice sprawią, że Spock okaże się idealny dla Twoich potrzeb. W tym artykule skupię się jedynie na aspekcie konfiguracji projektu maven oraz Spock w kilku wariantach – minimalnym, ze niezmodyfikowanymi nazwa klas testowych oraz konfiguracją Spock dla SpringBoot.

1. Konfiguracja Spock w pom.xml

Podstawowa konfiguracja Spocka sprowadza się w zasadzie jedynie do dodania zależności do Spock Framework, oraz na użyciu dwóch pluginów podczas budowania projektu. W fazie compleTest należy użyć pluginu gmavenplus-plugin, który skompiluje klasy testowe groovy a wynik umieści w target/test-classes. Aby testy zostały uruchomione musimy jeszcze skonfigurować plugin maven-surefire-plugin.

Uwaga! W domyślnej konfiguracji maven-surefire-plugin zakłada, że nasze testy będą miały sufiks “Test”, dlatego ważne jest aby naszą klasę testową nazwać np. DummySpecTest.groovy. Poniżej znajduje się przykładowy plik pom.xml z zaznaczoną minimalną konfiguracją, której należy dokonać.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Spock2xExample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>2.0-M3-groovy-3.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.gmavenplus</groupId>
                <artifactId>gmavenplus-plugin</artifactId>
                <version>1.11.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compileTests</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
            </plugin>
        </plugins>
    </build>
</project>

Po odświeżeniu konfiguracji pom.xml utwórz folder test/groovy. Niektóre IDE takie jak InteliJ idea powinny go rozpoznać jako folder z klasami w języku groovy. Jeśli masz z tym problem, to spróbuj reimportować projekt maven. Poniżej zamieszczam przykładowy test oraz strukturę katalogów, które mogą okazać się pomocne.

Spock tests – structure of directories
package com.bettercoding.spock

import spock.lang.Specification

class DummySpecTest extends Specification {
    def "This is my first test in Spock"() {
        given:
            def x = 1
        when:
            x = 2
        then:
            x == 1 //The test should fail here
    }
}

2. Konfiguracja nazw klas testowych

Domyślnie, maven-surefire-plugin uruchamia klasy testowe pasujące do poniższych wzorców.

    "**/Test*.java" - includes all of its subdirectories and all Java filenames that start with "Test".
    "**/*Test.java" - includes all of its subdirectories and all Java filenames that end with "Test".
    "**/*Tests.java" - includes all of its subdirectories and all Java filenames that end with "Tests".
    "**/*TestCase.java" - includes all of its subdirectories and all Java filenames that end with "TestCase".

Jeśli chcesz aby Twoje klasy groovy nazywały się inaczej np. DummyIntegrationSpec, to możesz dodać odpowiednią konfigurację do pom.xml. Jeśli interesuje Cię dokładnie ten temat, to odsyłam do oficjalnej dokumentacji.

3. Konfiguracja Spock dla Spring Framework (SpringBoot)

Konfiguracja Spock działającego ze Springiem, a w zasadzie ze SpringBootem rożni się kilkoma szczegółami:

  • pom.xml zawiera konfigurację spring-boot
  • Zamiast spock-core należy użyć zależności spock-spring
  • Na tę chwilę SpringBoot nie wspiera Groovy 3.0 dlatego koniecznie należy wybrać wersję Spocka pod groovy-2.5
  • Test powinien zostać oznaczony adnotacją @SpringBootTest

Poniższy plik pom.xml zawiera kompletną konfigurację SpringBoot wraz z frameworkiem testowym Spock. Zaznaczyłem w nim wspomniane detale różniące go od konfiguracji bez SpringBoot‘a.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Spock2xExample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-spring</artifactId>
            <version>2.0-M3-groovy-2.5</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.gmavenplus</groupId>
                <artifactId>gmavenplus-plugin</artifactId>
                <version>1.11.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compileTests</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
            </plugin>
        </plugins>
    </build>
</project>
package com.bettercoding.spock

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.context.ApplicationContext
import spock.lang.Specification

@SpringBootTest
class DummySpecTest extends Specification {

    @Autowired
    private ApplicationContext applicationContext

    def "Ckeck Spring application stared successfully"() {
        when:
            true
        then:
            applicationContext != null
    }
}
Na zakończenie mam jeszcze jedną prośbę.

Jeśli pomogłem Ci rozwiązać problem, to udostępnij proszę ten post. Dzięki temu będę miał okazję trafić do szerszej grupy odbiorców. Dziękuję

0 0 vote
Article Rating
Subscribe
Notify of
guest
0 komentarzy
Inline Feedbacks
View all comments