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.

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ę