2014-06-30 19 views
7

Utilizzo JUnit 4, Java 8 e Gradle 1.12. Ho un file con json predefinito che devo caricare. Il mio progetto ha src/main/java/ (contenente la sorgente del progetto), src/main/resources/ (vuoto), src/test/java/ (origine test unità) e src/test/resources/ (il file di dati json per caricare). Il file build.gradle si trova nella radice.Risorse di accesso nei test unitari

Nel mio codice che ho:

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

Da quello che ho letto, che mi dovrebbe dare accesso al file di risorse. Tuttavia, ottengo un'eccezione di puntatore nullo quando provo a utilizzare l'URL, poiché la chiamata getSystemResource() restituisce null.

Come accedere ai miei file di risorse?

+0

Avete la cartella/src/test/risorse nel classpath? –

+0

Ne dubito. Comunque non sto caricando le lezioni. – kwiqsilver

risposta

12

I nomi delle risorse non iniziano con una barra, quindi è necessario liberarsene. La risorsa dovrebbe preferibilmente essere letta con UnitTests.getClassLoader().getResourceAsStream("the/resource/name") o, se è richiesto un File, .

su Java 8, si potrebbe provare qualcosa di simile:

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

Il problema era la barra. Tutti gli esempi che ho letto hanno avuto un taglio principale per qualche ragione. Il suggerimento di Java 8 ha alcuni bug. Ecco il codice corretto, per chiunque usi questo: 'URI uri = UnitTests.class.getClassLoader(). GetResource (resource) .toURI(); return new String (Files.readAllBytes (Paths.get (uri)), Charset.forName ("utf-8")); ' – kwiqsilver

+1

Gli esempi utilizzavano' Class # getResource' invece di 'ClassLoader # getResource', o si sbagliavano. Risolto il problema con lo snippet di codice di Java 8. –

0

Penso che vuoi getResource invece di getSystemResource. Quest'ultimo è usato, ad esempio, per leggere un file dal file system, dove il percorso non verrebbe specificato in termini di jar.

Si può anche saltare il caricatore di classe: UnitTests.class.getResource("...")

Docs about resources here

Edit: ci sono alcuni commenti più dettagliati nelle risposte here.

+0

Stavo usando getResources, ma produce lo stesso errore. – kwiqsilver

+0

Dopo aver letto più attentamente, mi rendo conto di aver frainteso i documenti getSystemResource. Il suo argomento è specificato in termini di classpath dell'ambiente di sistema, non di root del file system, come stavo pensando quando ho scritto la risposta sopra. Lascerò la risposta qui per il bene dei collegamenti. –