12 April 2021

blog java junit tests

Problématique

L'idée pincipale est de pouvoir avoir des tests configurable par fichier de configuration, et executable par maven dans un environnement container.

Apercu des tests

Les tests dont je parle ici son au départ des tests JUnit4. L'application n'utilisait pas Spring Boot au départ.

Dans mes tests de KdmMailFetcher, j'utilise maintenant deux mécanismes : Spring, pour initier les tests comme des beans, ou bien initier l'assemblage des beans pour les tests d'intégration, et junitparams, pour faire des tests en série à partir d'un CSV.

JunitParams

J'utilise pour ma part, le fonctionnement qui consiste à alimenter les paramètres d'un test avec les lignes d'un fichier CSV. Permet de documenter les résultats de parcours de mails et des KDM que l'on est sensé y trouver.

La difficulté, pour le moment irrésolue, c'est que le csv qui paramètre ce test doit être défini de manière constante.

Piste : Utilisation des rules pour inclure Spring

Rappel fonctionnement des Rules
* Guide to JUnit 4 Rules

Je n'ai pas réussi à faire fonctionner le chargement par les rules.

  @ClassRule
  public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();

Ne produit rien, il doit falloir appeler quelque chose en plus.

Initialisation par Spring même lorsque le runner est différent.

Un exemle est donné, qui fonctionne avec le runner Parameterized.

 // [...]
 // Manually config for spring to use Parameterised
     private TestContextManager testContextManager;
	 
 // [...]
      @Before // Note 2
     public void setUp() throws Exception {
          this.testContextManager = new TestContextManager(getClass());
          this.testContextManager.prepareTestInstance(this);
     }

Cela fonctionne également avec mon exemple qui utilise le runner JunitParams.

Parameterized

Du coup, j'ai essayé de convertir le test en utilisant le runner Parameterized : fonctionne, mais ne résoud pas le problème de devoir charger l'emplacement dans une fonction statique, donc sans pouvoir utiliser le paramètre configuré par Spring.
Par ailleurs, on ne peut pas positionner une valeur statique en utilisant @Autowired.

Junit5

A noter que Parameterized a évolué dans JUnit5 et prévoit en particuleir une fonction pour les fichiers csv.

La mise en oeuvre demande une adaption des tests, et d'invalider le choix par défaut dans spring boot, qui utile Junit4.