2014-06-30 93 views
7

我正在使用JUnit 4,Java 8和Gradle 1.12。 我有我需要加載的默認json文件。我的項目有src/main/java/(包含項目源),src/main/resources/(空),src/test/java/(單元測試源)和src/test/resources/(要加載的json數據文件)目錄。 build.gradle文件位於根目錄中。訪問單元測試資源

在我的代碼有:

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

從我讀,應該給我訪問的資源文件。但是,當我嘗試使用URL時,我得到空指針異常,因爲getSystemResource()調用返回null。

如何訪問我的資源文件?

+0

你有在類路徑中/ src目錄/測試/資源文件夾? –

+0

我對此表示懷疑。雖然我沒有加載類。 – kwiqsilver

回答

12

資源名稱不以斜槓開頭,所以您需要擺脫它。該資源應優選與UnitTests.getClassLoader().getResourceAsStream("the/resource/name")一起閱讀,或者,如果需要File,則應使用new File(UnitTests.getClassLoader().getResource("the/resource/name").toURI())

在支持Java 8,你可以嘗試這樣的:

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

問題在於斜線。我讀過的所有例子都有一個主要的斜線出於某種原因。 Java 8的建議有一些錯誤。這裏是正確的代碼,對於任何使用它的人來說:'URI uri = UnitTests.class.getClassLoader()。getResource(resource).toURI(); return new String(Files.readAllBytes(Paths.get(uri)),Charset.forName(「utf-8」));' – kwiqsilver

+1

這兩個示例都使用'Class#getResource'而不是'ClassLoader#getResource',或者他們錯了。修復了Java 8代碼片段。 –

0

我想你想getResource而不是getSystemResource。例如,後者用於從文件系統中讀取文件,其中路徑不會根據jar指定。

您也可以跳過類裝載器:UnitTests.class.getResource("...")

Docs about resources here

編輯:有在回答here一些更詳細的評論。

+0

我正在使用getResources,但它會產生相同的錯誤。 – kwiqsilver

+0

仔細閱讀後,我意識到我誤解了getSystemResource文檔。它的參數是根據系統環境的類路徑而不是文件系統根來指定的,正如我在上面寫出答案時所考慮的那樣。爲了鏈接的緣故,我會留下答案。 –