2014-06-30 3 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. Последний используется, например, для чтения файла из файловой системы, где путь не будет указан в терминах банки.

Вы также можете пропустить загрузчик классов: UnitTests.class.getResource("...")

Docs about resources here

Edit: есть некоторые более подробные комментарии в ответах here.

+0

Я использовал getResources, но он производит ту же ошибку. – kwiqsilver

+0

Прочитав более внимательно, я понимаю, что неправильно понял документы getSystemResource. Его аргумент указан в терминах classpath, а не в корневой файловой системе, как я думал, когда писал ответ выше. Я оставлю ответ здесь ради ссылок. –

Смежные вопросы