web-dev-qa-db-fra.com

Junit + getResourceAsStream Returning Null

Je ne sais pas comment cela est possible. J'ai relu sur getResourceAsStream et il retourne toujours null.

InputStream source = this.getClass().getResourceAsStream("test.xml");

Juste à côté de test.Java dans le Finder (en utilisant OS X et Eclipse) se trouve test.xml

Je peux l'ouvrir dans TextWrangler et le voir comme existant avec des données à l'intérieur.

Il s'agit d'un test Junit s'il fait une différence. Je suis allé voir les tests Junit existants sur notre système et je les utilise exactement de la même manière qu'un exemple de travail (comme l'emplacement du fichier et le code lui-même).

Quelle petite différence pourrait-il y avoir empêchant je suppose que getClass () de retourner le bon chemin?

Merci!

34
bobber205

getResourceAsStream() utilise le CLASSPATH, et en tant que tel, il se chargera depuis où que soient vos classes, pas vos fichiers source.

Je soupçonne que vous devez copier votre XML dans le même répertoire que votre fichier .class.

22
Brian Agnew

Il ne s'agit pas de trouver la ressource sur le chemin de classe. Si vous utilisez junit et maven, assurez-vous que les ressources sont copiées sur les classes cible/test en ajoutant <include> directive de fichier sur <testResource> section

Vous pouvez également trouver l'emplacement de votre classe dans le système de fichiers en utilisant

this.getClass().getResource(".")

et vérifier si la ressource est là

27
surajz

Si vous utilisez Maven, ajoutez cette partie à votre pom.xml

<build>
    <testResources>
        <testResource>
            <directory>${project.basedir}/src/test/resources</directory>
        </testResource>
    </testResources>
</build>

Votre test.xml et les autres fichiers de ressources doivent être situés dans src/test/resources

12
gumkins

J'ai toujours un problème avec cette méthode. Voici 2 liens, qui pourraient être utiles:

J'essaie toujours d'ajouter "/" au début ou "./".

D'après mon expérience, la meilleure méthode consiste à utiliser FileInputStream. Il n'y a qu'une seule chose à retenir (lors de l'utilisation de FileInputStream avec Eclipse), avec les paramètres par défaut, votre répertoire de travail est défini sur racine des projets. Vous pouvez toujours vérifier où se trouve votre répertoire actuel (et quels chemins relatifs vous avez besoin) en utilisant ce morceau de code .

12

En supposant test.xml se trouve juste en dessous de votre dossier source racine test, procédez comme suit: -

InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");
8
limc

J'ai passé beaucoup de temps dans ce problème et il me manquait la configuration suivante: Faites un clic droit sur un projet Eclipse et sélectionnez Propriétés -> Java Build Path -> Source = et éditez inclus ligne et ajoutez * .properties (* .fileExtension)

1
egroque

De Java API:

http://docs.Oracle.com/javase/6/docs/api/Java/lang/ClassLoader.html#getSystemResource (Java.lang.String)

Recherchez une ressource du nom spécifié dans le chemin de recherche utilisé pour charger les classes. Cette méthode localise la ressource via le chargeur de classe système

Ainsi, la syntaxe sera par exemple: ClassLoader.getSystemResource ("test.xml"). ToString ();

Fonctionne comme un charme!

1
Espen

Essayez MyClass.getResourceAsStream ().

Essayez également de placer le test.xml dans votre chemin de classe. Par exemple, dans un projet Web Eclipse, mettez text.xml dans webcontent/WEB-INF/classes

1
Paul Croarkin

J'ai eu ce problème avec un cours de printemps. System.class.getResourceAsStream(...) fonctionnait dans les tests unitaires mais pas dans Tomcat, Thread.currentThread().getContextClassLoader().getResourceAsStream(...) travaillait dans Tomcat mais pas dans les tests unitaires.

En fin de compte, je suis allé avec:

ClassUtils.getDefaultClassLoader()
    .getResourceAsStream("com/example/mail/templates/invoice-past-due.html"))

J'ai également constaté qu'une fois que je l'avais fait de cette façon, j'avais pas besoin d'avoir le chemin commençant par une barre oblique.

0
Kip

Vous devez mettre la copie de votre fichier de ressources dans les ressources de test, dans mon exemple c'est un fichier de police:

enter image description here

Appelez ensuite à partir de votre test jUnit:

 public static InputStream getFontAsStream() throws IOException {
        return Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("fonts/" + "FreeSans.ttf");
    }
0
Yuliia Ashomok