web-dev-qa-db-fra.com

Quelle est la bonne façon d'écrire dans un fichier temporaire pendant les tests unitaires avec Maven?

J'ai écrit un test unitaire qui écrit un fichier dans le système de fichiers, étant donné qu'il n'a aucun chemin vers le répertoire de travail; donc s'il est exécuté à partir du répertoire du projet, il écrit dans la racine du projet, s'il est dans le répertoire parent du projet, il écrit dans le répertoire racine des parents.

Alors, quelle est la bonne façon d'écrire dans le répertoire cible? Très probablement un répertoire dans le répertoire cible?

Si je précise tout simplement target/ avec le fichier qu'il écrira sur la cible des projets parents au lieu de la cible des projets.

UPDATE : Je veux réellement le fichier une fois le test terminé. Le fichier est pour un format d'extraction pour les tiers qui doit être envoyé aux tiers. Le test peut être activé/désactivé pour me permettre de ne s'exécuter que si le format du fichier change pour une nouvelle approbation. Ce n'est pas un gros problème où va le fichier, mais j'aimerais quelque chose de facile à trouver.

53
Brett Ryan

Vous pouvez essayer d'utiliser TemporaryFolder JUnit @Rule comme décrit ici

TemporaryFolder crée un dossier dans le répertoire de fichiers temporaires par défaut spécifié par la propriété système Java.io.tmpdir. La méthode newFile crée un nouveau fichier dans le répertoire temporaire et newFolder crée un nouveau dossier.

Une fois la méthode de test terminée, JUnit supprime automatiquement tous les fichiers et répertoires dans et y compris le dossier temporaire. JUnit garantit la suppression des ressources, que le test réussisse ou échoue.


Après la mise à jour de la question

Vous pouvez changer le répertoire de travail utilisé par maven-surefire-plugin .

<plugins>
    [...]
      <plugin>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.3</version>
        <configuration>
          <workingDirectory>${project.build.directory}</workingDirectory>
        </configuration>
      </plugin>
    [...]
</plugins>

Vous pouvez remplacer ce répertoire de travail par tout ce dont vous avez besoin pour vos tests, comme ${project.build.directory}/my_special_dir/.

Le répertoire de travail du plugin surefire affecte uniquement les tests en cours d'exécution et UNIQUEMENT pour les tests effectués par maven. Si vous exécutez vos tests à partir d'un IDE le répertoire de travail sera autre chose.

64
maba

Pas besoin de réinventer la roue...

Le JDK permet de créer un fichier temporaire et de le supprimer automatiquement à la sortie:

File file = File.createTempFile( "some-prefix", "some-ext");
file.deleteOnExit();

Utilisez le fichier et il sera supprimé automatiquement une fois votre test terminé. C'est tout ce qu'on peut en dire.

Pour spécifier le répertoire à utiliser pour les fichiers temporaires, utilisez la méthode surchargée:

File file = File.createTempFile( "prefix", "ext", new File("/some/dir/path"));
38
Bohemian

J'écrirais une routine qui détermine où le fichier doit être écrit, que j'uniterai ensuite, en général j'essaie d'éviter (autant que possible) d'accéder aux données persistantes dans les tests, comme fichier IO ou base de données l'accès, cela a des raisons de performances et d'autres aussi.

Jetez un œil à cette réponse: https://stackoverflow.com/a/8032504/395659

2
CloudyMarble

Vous voudrez pouvoir exécuter vos tests à partir d'un IDE ainsi que de Maven, donc la meilleure pratique est d'écrire vos tests afin qu'ils ne supposent pas qu'ils sont exécutés dans Maven.

L'une des meilleures façons de gérer les fichiers temporaires consiste à utiliser règles junit . Cela vous permet de vous fier à la règle pour nettoyer à votre place.

2
Stephen Connolly

Les fichiers temporaires doivent être créés dans un répertoire temporaire. Récupérez-le à l'aide de l'appel System.getProperty("Java.io.tmpdir")

Le fichier temporaire doit être temporaire, c'est-à-dire qu'il doit être supprimé lorsqu'il n'est pas nécessaire. Pour y parvenir, n'oubliez pas de le supprimer dans le bloc finally ou dans le code qui s'exécute après le test, c'est-à-dire:

File tmpFile = ...
try {
   // deal with tempFile
} finally {
    tempFile.delete();
}

et/ou

public class MyTestCase {
    private File tmpFile = null;

    @Before
    public void setUp() {
        tmpFile = ...;
    }

    @Test
    public void setUp() {
        // deal with tmpFile
    }

    @After
    public void setUp() {
        tmpFile.delete();
    }
}

Utilisez File.createTempFile(String prefix, String suffix) si c'est possible, c'est-à-dire que vous pouvez ensuite utiliser un fichier avec un nom spécial généré par createTempFile().

Utilisez file.deleteOnExit(). Cela crée un hook qui supprime automatiquement le fichier à la fin de la JVM. Le fichier ne restera que si JVM a été tué avec kill -9, Il n'a donc pas eu la possibilité d'exécuter du code d'arrêt.

1
AlexR

Pour le dire à l'avance, je suis fermement contre de telles choses dans le test unitaire. Je n'ai pas vraiment essayé mais ça devrait marcher:

Supposons que vous utilisez le plugin surefire, à partir du document cité, vous pouvez accéder au répertoire de base du projet sous test par System.getProperty("basedir"). Obtenez-le et créez des fichiers sous basedir/target.

Une manière plus "appropriée" (comme nous pouvons avoir la chance de configurer le répertoire de sortie sur autre chose, vous pouvez changer la configuration du plugin surefire en quelque chose comme ceci:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <systemPropertyVariables>
            <myOutDir>${project.build.outputDirectory}</myOutDir>
        </systemPropertyVariables>
    </configuration>
</plugin>

Ensuite, vous pouvez obtenir le répertoire de sortie réel par System.getProperty("myOutDir") dans votre test.

1
Adrian Shum