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.

avertissement 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>

avertissement 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());
}

avertissement 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.