2014-06-30 5 views
7

J'utilise JUnit 4, Java 8 et Gradle 1.12. J'ai un fichier avec json par défaut que j'ai besoin de charger. Mon projet contient src/main/java/ (contenant la source du projet), src/main/resources/ (vide), src/test/java/ (source de test unitaire) et src/test/resources/ (le fichier de données json à charger). Le fichier build.gradle est dans la racine.Accéder aux ressources dans les tests unitaires

Dans mon code que j'ai:

public class UnitTests extends JerseyTest 
{ 
    @Test 
    public void test1() throws IOException 
    { 
    String json = UnitTests.readResource("/testData.json"); 
    // Do stuff ... 
    } 

    // ... 
    private static String readResource(String resource) throws IOException 
    { 
    // I had these three lines combined, but separated them to find the null. 
    ClassLoader c = UnitTests.class.getClassLoader(); 
    URL r = c.getSystemResource(resource); // This is returning null. ???? 
    //URL r = c.getResource(resource); // This had the same issue. 
    String fileName = r.getFile(); 
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) 
    { 
     StringBuffer fileData = new StringBuffer(); 
     char[] buf = new char[1024]; 
     int readCount = 0; 
     while ((readCount = reader.read(buf)) != -1) 
     { 
     String readData = String.valueOf(buf, 0, readCount); 
     fileData.append(readData); 
     } 

     return fileData.toString(); 
    } 
    } 
} 

D'après ce que je lis, cela devrait me donner accès au fichier de ressources. Toutefois, j'obtiens une exception de pointeur null lorsque j'essaie d'utiliser l'URL, car l'appel getSystemResource() renvoie null.

Comment puis-je accéder à mes fichiers de ressources?

+0

Avez-vous le/src/test/dossier de ressources dans votre classpath? –

+0

J'en doute. Je ne charge pas les cours. – kwiqsilver

Répondre

12

Les noms de ressources ne commencent pas par une barre oblique, vous devez donc vous en débarrasser. La ressource doit de préférence être lue avec UnitTests.getClassLoader().getResourceAsStream("the/resource/name") ou, si un File est requis, new File(UnitTests.getClassLoader().getResource("the/resource/name").toURI()).

Sur Java 8, vous pouvez essayer quelque chose comme:

URI uri = UnitTests.class.getClassLoader().getResource("the/resource/name").toURI(); 
String string = new String(Files.readAllBytes(Paths.get(uri)), CharSet.forName("utf-8")); 
+0

Le problème était la barre oblique. Tous les exemples que j'ai lus avaient une barre oblique pour une raison quelconque. La suggestion Java 8 a quelques bugs. Voici le code correct, pour quiconque utilise ceci: 'URI uri = UnitTests.class.getClassLoader(). GetResource (ressource) .toURI(); Renvoyer une nouvelle chaîne (Files.readAllBytes (Paths.get (uri)), Charset.forName ("utf-8")); ' – kwiqsilver

+1

Soit les exemples utilisaient la classe # getResource plutôt que" ClassLoader # getResource ", ou ils avaient tord. Correction du fragment de code Java 8 –

0

Je pense que vous voulez getResource au lieu de getSystemResource. Ce dernier est utilisé, par exemple, pour lire un fichier du système de fichiers, où le chemin ne serait pas spécifié en termes de jar.

Vous pouvez aussi sauter le chargeur de classe: UnitTests.class.getResource("...")

Docs about resources here

Modifier: il y a dans les réponses here des commentaires plus détaillés.

+0

J'utilisais getResources, mais cela produisait la même erreur. – kwiqsilver

+0

Après avoir lu plus attentivement, je me rends compte que j'ai mal compris les docs getSystemResource. Son argument est spécifié en termes de classpath de l'environnement système, pas de la racine du système de fichiers, comme je pensais lorsque j'ai écrit la réponse ci-dessus. Je vais laisser la réponse ici pour les liens. –

Questions connexes