Spring-Boot: Ecrire des tests unitaires & d’integration (part 3)

L'objet de ce billet est d'illustrer comment écrire des tests unitaires et d'intégration pour une application web basée sur Spring-Boot.

C'est avec une grande facilité que cette tâche va être réalisée.

Nous verrons comment mocker le contexte web et tester les appels aux Urls.

Avant de passer à la mise en pratique, signalons que la lecture de ce billet est indispensable.

Nous reprenons le projet démo du billet déjà cité que nous complétons avec ces étapes:

ETAPE 1. Mise à jour du pom


<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
	<version>4.0.0.M3</version>
</dependency>

<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.10</version>
</dependency>

ETAPE2. Ecrire le test

Il s'agit de tester le controller MySampleController.

En particulier l'accès à l'url "http://localhost:8080/".

Voici le contenu de la classe de test Junit:


package fr.netapsys.tests.springbootblog;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import o.s.beans.factory.annotation.Autowired;
import o.s.b.c.initializer.ConfigFileApplicationContextInitializer;
import o.s.b.c.initializer.LoggingApplicationContextInitializer;
import o.s.web.context.WebApplicationContext;
import o.s.test.context.ContextConfiguration;
import o.s.test.context.junit4.SpringJUnit4ClassRunner;
import o.s.test.context.web.WebAppConfiguration;
import o.s.test.web.servlet.MockMvc;
import o.s.test.web.servlet.setup.MockMvcBuilders;

import static 
    o.s.test.web.servlet.request.MockMvcRequestBuilders.get;
import static 
    o.s.test.web.servlet.result.MockMvcResultMatchers.status;

import static 
    o.s.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;

import fr.netapsys.springBootBlog.MySampleController;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = MySampleController.class)
public class TestSampleController {
 @Autowired
 private WebApplicationContext context;
 
 private MockMvc mockMvc;

 @Before
 public void setUp() {
	this.mockMvc = webAppContextSetup(this.context).build();
 }
 @Test
 public void testSampleController() throws Exception {
	this.mockMvc.perform(get("/"))
          .andExpect(status().isOk())
          .andExpect(content().string("<H2>Spring boot in action at 01/10/2013</H2>"));
 }
 @After
 public  void downUp(){
	this.mockMvc = null;
 }
}

Les points importants de ce code sont:

  • Notez dans les imports, o.s.b.c désigne org.springframework.boot.context,
  • L'annotation @RunWith permettant d'utiliser le lanceur Spring de tests "SpringJUnit4ClassRunner". Rien de nouveau ici,
  • L'annotation @WebAppConfiguration permettant d'accéder au contexte web courant,
  • L'annotation
@ContextConfiguration(classes = MySampleController.class)

indique la classe (main) point d'entrée à exécuter pour lancer l'application web.

Cette annotation peut être complétée ainsi:

@ContextConfiguration(
      classes = MySampleController.class, 
      initializers = {
	 ConfigFileApplicationContextInitializer.class,
	 LoggingApplicationContextInitializer.class })

  • L'instance du contexte WebApplicationContext est auto-injecté par Spring,

C'est ce contexte qui permet de construire un mock ci-dessous.

  • L'instance du MockMvc ce qui permet de mocker SpringMVC,

Notez que c'est la méthode statique webAppContextSetup de la ligne qui suit:

  webAppContextSetup(this.context).build()

qui a permis de construire le mockMvc.

Enfin, le test ne contient qu'un appel à:


 mockMvc.perform(get("/")).andExpect(status().isOk())

où la méthode statique get prend en paramètre un URI.

La méthode statique andExpect permet de vérifier le résultat.

ETAPE3. Exécuter le test

mvn test

Voilà tout, c'est simple sans se prendre la tête et les cheveux 🙂

Le prochain billet illustre avec quelle facilité notre application accède aux données d'une base.

Pour commencer il suffit d'écrire le schéma de la base et Spring-Boot s'occupe de tout!

2 commentaires

  1. A priori, il faudrait vérifier l’argument de @ContextConfiguration.
    Sinon, on pourrait vous aider si vous donniez plus de détails.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.