Test con Spring e Spock

1. Introduzione

In questo breve tutorial, mostreremo i vantaggi della combinazione della potenza di supporto del framework di test di Spring Boot e dell'espressività del framework Spock sia per i test unitari che per quelli di integrazione.

2. Configurazione del progetto

Cominciamo con una semplice applicazione web. Può salutare, modificare il saluto e ripristinarlo al valore predefinito tramite semplici chiamate REST. A parte la classe principale, utilizziamo un semplice RestController per fornire la funzionalità:

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

Quindi il controller saluta con "Hello world!". L' annotazione @RestController e le annotazioni di collegamento assicurano la registrazione dell'endpoint REST.

3. Dipendenze di Maven per Spock e Spring Boot Test

Iniziamo aggiungendo le dipendenze Maven e, se necessario, la configurazione del plugin Maven.

3.1. Aggiunta delle dipendenze di Spock Framework con Spring Support

Per Spock stesso e per il supporto Spring abbiamo bisogno di due dipendenze:

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

Si noti che le versioni specificate con sono un riferimento alla versione groovy utilizzata.

3.2. Aggiunta di Spring Boot Test

Per poter utilizzare le utilità di test di Spring Boot Test, abbiamo bisogno della seguente dipendenza:

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

3.3. Configurazione di Groovy

E poiché Spock è basato su Groovy, dobbiamo aggiungere e configurare anche gmavenplus -plugin per poter utilizzare questo linguaggio nei nostri test:

 org.codehaus.gmavenplus gmavenplus-plugin 1.6    compileTests    

Nota che poiché abbiamo solo bisogno di Groovy per scopi di test e quindi limitiamo l'obiettivo del plugin a compileTest .

4. Caricamento di ApplicationContext in uno Spock Test

Un semplice test consiste nel verificare se tutti i bean nel contesto dell'applicazione Spring sono stati creati :

@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 } }

Per questo test di integrazione, dobbiamo avviare ApplicationContext , che è ciò che @SpringBootTest fa per noi. Spock fornisce la separazione delle sezioni nel nostro test con parole chiave come " quando" , " allora" o " aspettati" .

Inoltre, possiamo sfruttare Groovy Truth per verificare se un bean è nullo, come l'ultima riga del nostro test qui.

5. Utilizzo di WebMvcTest in uno Spock Test

Allo stesso modo, possiamo testare il comportamento del WebController :

@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!" } }

È importante notare che nei nostri test di Spock (o meglio Specifiche) possiamo usare tutte le annotazioni familiari dal framework di test Spring Boot a cui siamo abituati.

6. Conclusione

In questo articolo, abbiamo spiegato come impostare un progetto Maven per utilizzare Spock e il framework di test Spring Boot combinati. Inoltre, abbiamo visto come entrambi i framework si integrano perfettamente.

Per un'immersione più approfondita, dai un'occhiata ai nostri tutorial sui test con Spring Boot, sul framework Spock e sul linguaggio Groovy.

Infine, il codice sorgente con esempi aggiuntivi può essere trovato nel nostro repository GitHub.