Jimfs Comment simplifier les tests
Contexte
Lors des tests, nous sommes quelquefois amené à réaliser des opérations sur des fichiers. L’API Java nous offre bien la possibilité de créer des fichiers temporaires, mais cela rend quand même le code plus complexe.
C’est là qu’intervient la librairie Jimfs qui va nous aider. C’est une librairie qui implémente l’API NIO de Java (7+) en tant que système de fichiers en mémoire.
Pour rappel, l’API NIO de java fournit des classes comme Path
, Files
, FileSystem
et d’autres qui permettent de réaliser des opérations sur les répertoires et les fichiers.
En évitant les opérations de lecture et l’écriture sur disque, cela permet aussi d’améliorer le temps d’exécution car il n’y a plus d’entrées-sorties (opérations par définition longue). Tout se passe en mémoire.
Déclaration
Disponible sur Maven Central, il suffit d’indiquer la dépendance.
<dependency>
<groupId>com.google.jimfs</groupId>
<artifactId>jimfs</artifactId>
<version>1.1</version>
</dependency>
C’est une librairie réalisée et maintenue par Google
Utilisation
La seule particularité est la manière de récupérer le système de fichiers.
FileSystem fs = Jimfs.newFileSystem();
Pour le reste, comme cité plus haut, nous utilisons simplement l’api Java NIO.
-
Création de répertoire :
Path repertoire = fs.getPath(NOM_REPERTOIRE);
Files.createDirectories(repertoire);
-
Création de fichier :
Path fichier = repertoire.resolve(NOM_FICHIER);
Files.write(fichier, ImmutableList.of("Hello World"), StandardCharsets.UTF_8);
Dans l’exemple, j’ai utilisé la méthode Files.write
pour écrire le contenu du fichier.
Cependant, il est possible de passer par la classe BufferedWriter
ou la classe BufferedReader
. Voici un exemple pour la lecture du fichier
try (BufferedReader breader = Files.newBufferedReader(fichier)) {
return (breader.readLine().length());
}
Bien sûr, mais c’est quand même mieux quand c’est écrit : Il faut que la variable fichier de type Path
soit construite à partir du système de fichiers.
Bonus
Ce qui est aussi très intéressant, c’est aussi le support des différents systèmes de fichiers. De ce coté, la liste est complète :
-
Windows
-
Mac OS
-
Unix
Cela permet de tester le comportement avec des chemins Windows bien que nous soyons sur un système Linux.
Pour cela, il suffit de préciser la configuration lors de la construction de l’instance FileSystem
FileSystem fs = Jimfs.newFileSystem(Configuration.windows());
Path repertoire = fs.getPath("C:\\mon-dossier");
Files.createDirectories(repertoire);
assertEquals(repertoire.getRoot().toString(), "C:\\");
Le projet supporte plein d’autres fonctionnalités de l’API NIO de Java.
Profites-en.
Moteur de recherche
"Eduquer, ce n'est pas remplir des vases mais c'est d'allumer des feux." - Michel Montaigne
Billets récents
- Eclipse plante systématiquement sous Debian (et autres distribution Linux)
- JEP 463, Implicitly Declared Classes and Instance Main Methods (Second Preview)
- Debian - Montée de version de Debian 11 (Bullseye) à Debian 12 (Bookworm)
- JEP 451, Prepare to Disallow the Dynamic Loading of Agents
- JEP 444, Virtual Threads