Testen mit Spring und Spock

Testen mit Feder und Spock

1. Einführung

In diesem kurzen Tutorial zeigen wir die Vorteile der Kombination der Unterstützungskraft vonSpring Boottesting framework und der Ausdruckskraft vonSpock framework, unabhängig davon, ob dies für Einheiten oderintegration tests gilt .

2. Projektaufbau

Beginnen wir mit einer einfachen Webanwendung. Es kann die Begrüßung empfangen, ändern und durch einfache REST-Aufrufe auf die Standardeinstellungen zurücksetzen. Abgesehen von der Hauptklasse verwenden wir ein einfachesRestController, um die Funktionalität bereitzustellen:

@RestController
@RequestMapping("/hello")
public class WebController {

    @GetMapping
    public String salutation() {
        return "Hello world!";
    }
}

Also grüßt der Controller mit "Hallo Welt!". Die Annotation@RestController undshortcut annotations stellen die REST-Endpunktregistrierung sicher.

3. MavenDependencies for Spock and Spring Boot Test

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

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

FürSpock itself und fürSpring support 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 mit angegebenen Versionen einen Verweis auf die verwendete Groovy-Version darstellen.

3.2. Hinzufügen von Spring Boot Test

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


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

3.3. Groovy einrichten

Und da Spock aufGroovy basiert, kannwe have to add and configure the gmavenplus-plugin as well diese Sprache in unseren Tests nicht verwenden:


    org.codehaus.gmavenplus
    gmavenplus-plugin
    1.6
    
        
            
                compileTests
            
        
    

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

4. Laden derApplicationContext in einem Spock-Test

Ein einfacher Test istcheck if all Beans in the Spring application context are created:

@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 wirApplicationContext starten, was@SpringBootTest für uns tut. Spock liefert die Abschnittstrennung in unserem Test mit den Schlüsselwörtern "when”", "then”" oder "expect”".

Außerdem können wirGroovy Truth ausnutzen, um zu überprüfen, ob eine Bean null ist, als letzte Zeile unseres Tests hier.

5. Verwenden vonWebMvcTest in einem Spock-Test

Ebenso können wir das Verhalten derWebController 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 in unseren Spock-Tests (oder vielmehrSpecifications) we can use all familiar annotations from the Spring Boot test framework that we are used to.

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 schauen Sie sich unsere Tutorials übertesting with Spring Boot, überSpock framework und überGroovy language an.

Schließlich finden Sie den Quellcode mit zusätzlichen Beispielen in unserenGitHub repository.