Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Java Spring
  3. Les tests et Spring
Extrait - Java Spring Le socle technique des applications Jakarta EE (4e édition)
Extraits du livre
Java Spring Le socle technique des applications Jakarta EE (4e édition) Revenir à la page d'achat du livre

Les tests et Spring

Introduction

Les préoccupations centrées sur les tests sont fondamentales dans les développements d’aujourd’hui. Le TDD (Test-Driven Development ou en français développement piloté par les tests), qui consiste, lors de l’écriture de nos programmes, à écrire les tests unitaires avant d’écrire le code source d’un logiciel, est de plus en plus utilisé. Depuis quelque temps nous utilisons aussi des BDD (Behavior Driven Development) qui sont une évolution du TDD avec lequel on décrit les tests via des phrases, par exemple, en français ou en anglais avec une syntaxe particulière, qui sont ensuite utilisées avec un framework comme Cucumber. Il existe aussi les ATDD (Acceptance Test-Driven Development) pour lesquels on transcrit les critères d’acceptation dans les tests.

Spring propose des API qui nous simplifient la mise en œuvre des tests unitaires (TU) et des tests d’intégration (TI). Il faut tester tout ce qui vaut le coup d’être testé. Si vous rencontrez des problèmes lors de la rédaction des TU et TI, c’est qu’il faut retravailler (refactoriser) votre code. Une bonne pratique consiste à écrire le test en même temps que la classe testée et même parfois à coder les tests avant l’implémentation...

Les mock objects

Quand nous testons une classe, nous voulons centrer nos tests sur celle-ci et nous devons alors trouver un moyen de ne pas tester les autres classes qui interagissent avec la classe testée. Nous pouvons utiliser des simulacres d’objets nommés mocks pour ne pas avoir à invoquer des objets réels qui demanderaient un contexte d’exécution trop étendu.

Spring fournit un ensemble de mocks très complet. Ils sont plus simples à utiliser que les mocks EasyMock et MockObjects. On les utilise souvent avec le framework Mockito (http://site.mockito.org/).

Type de mock

Utilisation

Environnement

Classes liées à l’environnement d’exécution.

JNDI

Simule des ressources JNDI comme une datasource.

API des Servlets

Simule une servlet, utile avec Spring MVC.

API des Portlets

Simule les portlets Spring MVC (disparaît avec Spring 5+).

Support

Outils aidant pour l’introspection des objets.

1. Mocks spécialisés pour "environnement"

On simule les classes d’environnements.

Classe

Mock

Environnement

MockEnvironment

@PropertySource

MockPropertySource

Ces mocks permettent de simuler un environnement et un PropertySource.

2. Support

a. Utilités générales

La classe ReflectionTestUtils du package org.springframework. test.util apporte des aides pour l’introspection et la manipulation des objets. Tous les membres des classes deviennent accessibles, même les membres « private ».

Par exemple, pour une classe Vehicule :

public class Vehicule { 
[accesseurs] 
   private long id; 
   private String modele; 
} 

Nous pouvons faire ce que nous voulons :

final Vehicule person = new Vehicule();  
ReflectionTestUtils.setField(person, "id", new Long(99), 
long.class); 
assertEquals("id", 99L, person.getId());  
ReflectionTestUtils.setField(person, "modele", null, String.class); 
assertNull("modele", person.getModele()); 
try {  
   ReflectionTestUtils.setField(person, "id", null, long.class); 
   fail("Devrait lever une exception !"); 
} catch (IllegalArgumentException aExp) { 
   assert (aExp.getMessage() 
               .contains("IllegalArgumentException")); ...

Les frameworks de test JUnit et TestNG

Spring a intégré les deux frameworks les plus complets aujourd’hui afin d’en simplifier l’utilisation. La construction d’un environnement pour lancer nos tests devient un jeu d’enfant et il est possible de ne charger en mémoire que le strict minimum pour pouvoir faire nos tests. Il y a deux versions de JUnit : la version 4 et la version 5 appelée Jupiter. Il est possible de mixer la syntaxe du JUnit4 avec Jupiter pour des projets hybrides ou en cours de migration. Dans la suite de ce chapitre, nous allons voir les tests d’intégration qui utilisent Spring et JUnit. Les tests utilisant TestNG sont similaires à ceux qui utilisent JUnit et ne sont pas détaillés.

Les tests unitaires sont faits hors Spring et ne sont donc pas traités ici.

Les tests d’intégration sont relativement complexes car nous cherchons à créer le contexte minimum, contenant le minimum de beans Spring qui sont nécessaires et suffisants pour tester la partie que nous souhaitons tester.

1. Utilisation avec JUnit 4

La librairie JUnit est très bien documentée sur ce site : http://junit.org/. Elle se base sur des runners qui aident à la configuration des tests.

a. Spring JUnit Runner

Spring a intégré JUnit avec la classe SpringJUnit4ClassRunner.class qui s’utilise en conjonction avec l’annotation @RunWith.

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({}) 
public class SimpleTest { 
    @Test 
public void testMethod() { 
[...] 
} 

b. @IfProfileValue

L’annotation fonctionne comme @ActiveProfiles et peut être mise sur la classe ou sur une méthode.

@IfProfileValue(name="java.vendor", value="Oracle Corporation") 
@Test 
public void testProcessavecJvmOracle() {  
 
@IfProfileValue ( name = "test-groups" , values ={ "unit-tests" ,  
"integration-tests" }) 
@Test 
public  void  
testProcessWhichRunsForUnitOrIntegrationTestGroups() { 
     // une certaine logique qui devrait fonctionner uniquement 
     // pour les tests unitaires et les tests d'intégration 

c. @ProfileValueSourceConfiguration...

Points clés

  • Les tests sont faciles à implémenter avec Spring.

  • Il faut faire tous les tests nécessaires pour une maintenance facilitée.

  • Spring permet de tester dans un environnement très léger.

  • Les tests Spring sont très performants.