Je sais que je peux charger un fichier depuis src / test / resources avec:
getClass().getResource("somefile").getFile()
Mais comment puis-je obtenir le chemin complet vers le répertoire src / test / resources , c'est-à-dire que je ne veux pas charger un fichier, je veux juste connaître le chemin du répertoire?
org.junit.rules.TemporaryFolder
tout le temps ... mais ... pour copier à partir de tests / ressources, vous devez connaître, euh, son chemin!Réponses:
Essayez de travailler avec la
ClassLoader
classe:A
ClassLoader
est responsable du chargement dans les classes. Chaque classe a une référence à aClassLoader
. Ce code renvoie unFile
du répertoire de ressources. L'appelergetAbsolutePath()
renvoie son absoluPath
.Javadoc pour
ClassLoader
: http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.htmlla source
Vous n'avez pas besoin de jouer avec les chargeurs de classe. En fait, c'est une mauvaise habitude à prendre parce que les ressources du chargeur de classe ne sont pas objets java.io.File lorsqu'ils sont dans une archive jar.
Maven définit automatiquement le répertoire de travail actuel avant d'exécuter les tests, vous pouvez donc simplement utiliser:
resourcesDirectory.getAbsolutePath()
renverra la valeur correcte si c'est ce dont vous avez vraiment besoin.Je recommande de créer un
src/test/data
répertoire si vous souhaitez que vos tests accèdent aux données via le système de fichiers. Cela montre clairement ce que vous faites.la source
J'utiliserais simplement
Path
de Java 7Propre et net!
la source
Paths.get(...)
suggère (pour moi de toute façon) que ce ne sera pas le cas.File.separator
constant pour construire la chaîne à utiliser comme cheminnew File("src/test/resources")
fait la bonne chose sur toutes les plateformes.Path resourceDirectory = Paths.get("src","test","resources");
?Paths.get("src", "test", "resources")
etPaths.get("src/test/resources")
fonctionne bien sur Windows 10 pour moi. Qu'est-ce que je fais mal? =)S'il s'agit d'un projet Spring, nous pouvons utiliser le code ci-dessous pour obtenir des fichiers du dossier src / test / resource .
la source
J'ai un projet Maven3 utilisant JUnit 4.12 et Java8. Afin d'obtenir le chemin d'un fichier appelé
myxml.xml
soussrc/test/resources
, je le fais à partir du scénario de test:Testé sur Ubuntu 14.04 avec IntelliJ IDE. Référence ici .
la source
Tout le contenu
src/test/resources
est copié dans letarget/test-classes
dossier. Donc, pour obtenir un fichier à partir des ressources de test lors de la construction de maven, vous devez le charger à partir dutest-classes
dossier, comme ça:Panne:
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
- vous donner l'URItarget/test-classes
.resolve(Paths.get("somefile"))
- résoutsomeFile
dans letarget/test-classes
dossier.La réponse originale est tirée de cette
la source
Il existe des différences et des contraintes dans les options offertes par @Steve C et @ ashosborne1. Il faut les préciser, je crois.
Quand pouvons-nous utiliser
File resourcesDirectory = new File("src/test/resources");
:?IntelliJ IDEA
seulement, mais je pense que tous les IDE fonctionnent comme ça. Et cette configuration qui doit être faite manuellement, n'est pas bonne du tout. Travailler avec plusieurs tests existant dans différents projets maven, mais importés dans un grand projet «IDE», nous obligent à nous en souvenir et ne permettent pas de se détendre et de profiter de votre travail.La solution offerte par @ ashosborne1 (personnellement, je préfère celle-ci) nécessite 2 exigences supplémentaires qui doivent être effectuées avant d'exécuter des tests. Voici une liste d'étapes pour utiliser cette solution:
Créez un dossier de test («teva») et un fichier («readme») à l'intérieur de «src / test / resources /»:
src / test / resources / teva / readme
Le fichier doit être créé dans le dossier de test, sinon cela ne fonctionnera pas. Maven ignore les dossiers vides.
Créez au moins une fois le projet via
mvn clean install
. Il exécutera également des tests. Il peut être suffisant d'exécuter uniquement votre classe / méthode de test via maven sans construire un projet entier. Par conséquent, vos ressources de test seront copiées dans des classes de test, voici un chemin:target/test-classes/teva/readme
Après cela, vous pouvez accéder au dossier à l'aide de code, déjà proposé par @ ashosborne1 (je suis désolé, je n'ai pas pu modifier correctement ce code dans cette liste d'éléments):
Vous pouvez maintenant exécuter votre test via IDE autant de fois que vous le souhaitez. Jusqu'à ce que vous exécutiez mvn clean. Il supprimera le dossier cible.
La création d'un fichier dans un dossier de test et l'exécution de maven pour la première fois, avant d'exécuter des tests via IDE, sont des étapes nécessaires. Sans ces étapes, si vous venez de créer des ressources de test dans votre IDE, puis d'écrire test et de l'exécuter via IDE uniquement, vous obtiendrez une erreur. L'exécution de tests via mvn copie les ressources de test dans target / test-classes / teva / readme et elles deviennent accessibles pour un chargeur de classe.
Vous pouvez vous demander, pourquoi ai-je besoin d'importer plus d'un projet maven dans IDE et pourquoi tant de choses compliquées? Pour moi, l'une des principales motivations: garder les fichiers liés à l'IDA loin du code. Je crée d'abord un nouveau projet dans mon IDE. C'est un faux projet, c'est juste un détenteur de fichiers liés à l'IDE. Ensuite, j'importe des projets maven déjà existants. Je force ces projets importés à conserver les fichiers IDEA uniquement dans mon faux projet d'origine. Par conséquent, je ne vois pas de fichiers liés à l'IDE dans le code. SVN ne devrait pas les voir (ne proposez pas de configurer svn / git pour ignorer ces fichiers, s'il vous plaît). C'est aussi très pratique.
la source
.gitignore
? Il semble également que IDEA exécute Maven automatiquement lors de l'exécution des tests (et définit le répertoire de travail correct par défaut$MODULE_DIR$
). Il n'est donc pas nécessaire d'exécutermvn test
manuellement avant cela, tout fonctionne bien à la fois avec Maven et IDEA avec just"src/test/resources/somefile.txt"
.La solution la plus simple et la plus propre que j'utilise, supposons que le nom de la classe de test soit
TestQuery1
et qu'il y ait unresources
répertoire dans votretest
dossier comme suit:Pour obtenir l'URI de
TestQuery1
do:Pour obtenir l'URI de l'un des fichiers
TestQuery1
, procédez comme suit:la source
Vous ne pouvez pas utiliser un fichier d'un dossier de ressources pour les tests dans un cas courant. La raison en est que les fichiers de ressources du dossier de ressources sont stockés dans un bocal. Ils n'ont donc pas de chemin réel dans le système de fichiers.
La solution la plus simple peut être:
TemporaryFolder
fromJUnit
peut être utilisé pour créer des fichiers temporaires et les supprimer une fois le test terminé. Les classes de laguava
bibliothèque sont utilisées pour copier un dossier de ressources sous forme de fichier.Veuillez noter que si nous utilisons un sous-dossier dans le dossier des ressources, comme
good
celui-ci, nous n'avons pas besoin d'ajouter/
le début du chemin d'accès aux ressources.la source
Utilisez ce qui suit pour injecter Hibernate avec Spring dans vos tests unitaires:
Si vous n'avez pas le
hibernate.cfg.xml
présent dans votresrc/test/resources
dossier, il retombera automatiquement dans celui de votresrc/main/resources
dossier.la source
Utilisez .getAbsolutePath () sur votre objet File.
la source
getFile()
renvoie une instance de fichier. Il dit qu'ilgetAbsolutePath()
est utilisé sur une instance d'un objet File.Avec Spring, vous pouvez facilement le lire à partir du dossier des ressources (principal / ressources ou test / ressources):
Par exemple, créez un fichier:
test/resources/subfolder/sample.json
la source
la source