Testen mit Spring und Spock

1. Einleitung

In diesem kurzen Tutorial zeigen wir die Vorteile der Kombination der unterstützenden Leistung des Spring Boot-Testframeworks und der Ausdruckskraft des Spock-Frameworks, sei es für Unit- oder Integrationstests.

2. Projekteinrichtung

Beginnen wir mit einer einfachen Webanwendung. Es kann die Begrüßung begrüßen, ändern und durch einfache REST-Aufrufe auf den Standardwert zurücksetzen. Abgesehen von der Hauptklasse verwenden wir einen einfachen RestController , um die folgenden Funktionen bereitzustellen:

@RestController @RequestMapping("/hello") public class WebController { @GetMapping public String salutation() { return "Hello world!"; } }

Der Controller begrüßt also mit "Hallo Welt!". Die @ RestController- Annotation und die Shortcut-Annotationen stellen die REST-Endpunktregistrierung sicher.

3. Maven- Abhängigkeiten für den Spock- und Spring-Boot-Test

Wir beginnen mit dem Hinzufügen der Maven-Abhängigkeiten und bei Bedarf der Maven-Plugin-Konfiguration.

3.1. Hinzufügen der Spock Framework-Abhängigkeiten mit Spring Support

Für Spock selbst und für die Spring-Unterstützung benötigen wir zwei Abhängigkeiten:

 org.spockframework spock-core 1.2-groovy-2.4 test   org.spockframework spock-spring 1.2-groovy-2.4 test  

Beachten Sie, dass die angegebenen Versionen einen Verweis auf die verwendete groovige Version enthalten.

3.2. Spring Boot Test hinzufügen

Um die Testdienstprogramme von Spring Boot Test verwenden zu können, benötigen wir die folgende Abhängigkeit:

 org.springframework.boot spring-boot-starter-test 2.2.2.RELEASE test 

3.3. Groovy einrichten

Und da Spock auf Groovy basiert, müssen wir auch das gmavenplus- Plugin hinzufügen und konfigurieren , um diese Sprache in unseren Tests verwenden zu können:

 org.codehaus.gmavenplus gmavenplus-plugin 1.6    compileTests    

Beachten Sie, dass wir Groovy nur zu Testzwecken benötigen und daher das Plugin-Ziel auf compileTest beschränken .

4. Laden des ApplicationContext in einem Spock-Test

Ein einfacher Test besteht darin, zu überprüfen, ob alle Beans im Spring-Anwendungskontext erstellt wurden :

@SpringBootTest class LoadContextTest extends Specification { @Autowired (required = false) private WebController webController def "when context is loaded then all expected beans are created"() { expect: "the WebController is created" webController } }

Für diesen Integrationstest müssen wir den ApplicationContext starten , was @SpringBootTest für uns tut. Spock stellt die Abschnittsunterscheidung in unserem Test mit den Schlüsselwörtern " wann" , " dann" oder " erwarten" bereit .

Darüber hinaus können wir Groovy Truth als letzte Zeile unseres Tests hier ausnutzen, um zu überprüfen, ob eine Bean null ist.

5. Verwenden von WebMvcTest in einem Spock-Test

Ebenso können wir das Verhalten des WebControllers testen :

@AutoConfigureMockMvc @WebMvcTest class WebControllerTest extends Specification { @Autowired private MockMvc mvc def "when get is performed then the response has status 200 and content is 'Hello world!'"() { expect: "Status is 200 and the response is 'Hello world!'" mvc.perform(get("/hello")) .andExpect(status().isOk()) .andReturn() .response .contentAsString == "Hello world!" } }

Es ist wichtig zu beachten, dass wir in unseren Spock-Tests (bzw. Spezifikationen) alle bekannten Anmerkungen aus dem gewohnten Spring Boot-Testframework verwenden können.

6. Fazit

In diesem Artikel haben wir erklärt, wie Sie ein Maven-Projekt einrichten, um Spock und das Spring Boot-Testframework zusammen zu verwenden. Darüber hinaus haben wir gesehen, wie sich beide Frameworks perfekt ergänzen.

Für einen tieferen Tauchgang lesen Sie unsere Tutorials zum Testen mit Spring Boot, zum Spock-Framework und zur Groovy-Sprache.

Den Quellcode mit zusätzlichen Beispielen finden Sie in unserem GitHub-Repository.