2015-04-24 13 views
1

Я использую Maven и запустить тест JUnit на статический метод, который пытается прочитать в файле с помощью:getResourceAsStream() - InputStream нуль при использовании относительного пути

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename); 

а затем с помощью new InputStreamReader(is) использовать как читатель в другом вызове. Это работает, когда filename является только именем файла (например, file.csv), но когда filename является относительным путем (например, src/test/resources/file.csv), is заканчивается null.

Мне нужно, чтобы он обрабатывал относительные пути, потому что я запускаю тестовый пакет через JUnit, который ищет ресурсы с относительными путями, и эти тесты поступают из JAR, что я не могу контролировать изменения (т.е. я реализовал фасад класс реализации, который тестовый набор использует, чтобы называть свои собственные тесты собственными ресурсами - они не поддаются контролю).

Есть ли способ для этого подхода работать с относительными путями или каким-либо другим способом, чтобы я мог найти эти ресурсы на моем пути к классам, которые ищут тесты?

+0

Попробуйте удалить src и начать с/test. – Renatols

+0

Относительно чего? – RealSkeptic

+0

Это был просто общий пример. Я не смогу изменить пути, которые получают, потому что они находятся в наборе тестирования, который я не могу изменить. Надежда состоит в том, что необходимые ресурсы накладываются на мой путь к классу, а затем код будет соответствующим образом находить их при создании InputStream. – aconkey

ответ

1

Выполнение тестов в мавена, src/test/resources/ есть (по умолчанию) «отображается» на корень из класса (погрузчиком) пути, так что в вашем случае file.csv правильного абсолютного путь src/test/resources/file.csv.

Чтобы загрузить "src/test/resources/file.csv" (ресурс) успешно, вы должны иметь этот файл (физически) в наличии: src/test/resources/src/test/resources/file.csv, или соответственно src/main/java (который также будет отображаться в ф корень) ... /src/test/resources/file.csv

+1

Ввод кода в свой собственный метод не будет исправить что-нибудь. Он все равно собирается вернуть null. – aconkey

0

В своих концах случае is что когда выполняется поиск ресурса, каталог resources является точкой входа, поэтому ожидается, что полный путь будет test/resources/src/test/resources/file.csv или test/resources/src/test/resources/file.csv в зависимости от того, как вы запускаете свои тесты.

Единственный надежный способ, которым вы могли бы достичь своей цели, - позаботиться о правильности вручную. Возможно, что-то вроде этого:

static String getResourceFileName(String maybePath) { 
    Path path = Paths.get(maybePath); 
    if (path.getNameCount() > 0) { 
     return path.getFileName().toString(); 
    } else { 
     throw new IllegalArgumentException("Can't derive filename given " + maybePath); 
    } 
} 

@Test 
public void testSoq() throws Exception { 
    String fileName0 = getResourceFileName("file"); 
    InputStream is0 = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName0); 

    String fileName1 = getResourceFileName("src/test/resources/file"); 
    InputStream is1 = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName1); 
    String string0 = new BufferedReader(new InputStreamReader(is0)).readLine(); 
    String string1 = new BufferedReader(new InputStreamReader(is1)).readLine(); 
    assertEquals(string0, string1); // OK 
} 

Может быть, вы должны написать его в соответствии со спецификой Вашего случая (счет возможного вложенного diretories и т.д.), но я действительно думаю, что с учетом ваших входов могут быть произвольной природа , это не будет намного проще.

0

У меня есть это на блоге (на испанском языке)

http://lacuevadeyogui.blogspot.com/2015/04/diferencia-entre-uri-y-url.html

Проблема с использованием ссылки на файл в SRC/тест/ресурсы

попробовать этот

URL url = getClass().getClassLoader().getResource("file.csv"); 
File f; 
try { 
    f = new File(url.toURI()); 
} catch (URISyntaxException e) { 
    f = new File(url.getPath()); 
} 

На конец, конвертировать файл в inputStream.

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