Как мне найти файлы тестовых ресурсов в Java-проекте, управляемом Maven? - PullRequest
10 голосов
/ 29 марта 2011

У меня есть проект, который использует нормальную структуру Maven, например,

module
\ src
  \ main
    - java
    - resources
  \ test
    - java
    - resources

и т.д.. В test/resources я хотел бы сохранить набор тестовых входных файлов для анализатора, который я пишу, а затем запустить все файлы в каталоге через набор тестов. Как написано сейчас, тестовый код работает из командной строки, но завершается неудачно при запуске через плагин Eclipse JUnit:

File file = new File("src/test/resources");
file.list();

(на самом деле я использую FilenameFilter, но я пытаюсь упростить.)

После прохождения модульного теста с помощью отладчика проблема заключается в том, что создаваемый файл указывает на /path/to/workspace/myproj/src/test/resources, тогда как фактические файлы находятся в /path/to/workspace/myproj/modulename/src/test/resources (это многомодульный проект Maven). ). Видимо, это не проблема при запуске mvn test из командной строки.

Полагаю, мой вопрос двоякий: один, , я делаю это неправильно ? Я вижу много людей, использующих загрузчик классов для обнаружения ресурсов, как в этот вопрос , но я не хочу все ресурсы определенного типа, только один каталог для тестирования /Ресурсы. Во-вторых, если это вообще не страшная идея, есть ли у меня ошибка конфигурации (например, она "должна" работать)? Это ошибка «Затмения», проблема Maven или что?

Ответы [ 4 ]

9 голосов
/ 29 марта 2011

Одна хитрость заключается в том, чтобы поместить файл в ресурсы с известным именем, получить URI этого файла через загрузчик классов, затем создать файл из этого URI, затем получить родительский элемент и перечислить () содержимое этого каталога.,Что-то вроде хака, но это должно сработать.

Вот как должен выглядеть код, но поместите файл с именем MY_TEST_FILE (или что-то еще) в test / src / resources

URL myTestURL = ClassLoader.getSystemResource("MY_TEST_FILE");
File myFile = new File(myTestURL.toURI());
File myTestDir = myFile.getParentFile();

Тогда у вас есть доступ к каталогу, который вы ищете.

Тем не менее, я был бы удивлен, если бы не было более 'maven-y' способа сделать это ..

5 голосов
/ 09 января 2014

Просто для полноты, я хотел бы указать способ получить это без необходимости брать текущий экземпляр ClassLoader, используя ClassLoader#getSystemResource.Этот пример делает работу без необходимости размещать файл вверху.

//Obtains the folder of /src/test/resources
URL url = ClassLoader.getSystemResource("");
File folder = new File(url.toURI());
//List contents...
2 голосов
/ 29 февраля 2012

Попробуйте это?

1) поместите файлы тестовых данных в ту же структуру пакета, что и тестируемые классы. То есть, если у вас есть тестовый класс с именем Apple в src / test / java / com / fruits, файл тестовых данных будет находиться в src / resources / java / com / fruits.

2) Когда файлы скомпилированы, класс и файл данных должны находиться в target / test-classes / com / fruits. Если это так, в вашем коде вы можете получить файл следующим образом: "this.getClass (). GetResourceAsStream (" myFile ")"

0 голосов
/ 26 ноября 2013
  1. положить желаемый ресурс в /src/test/resources/lipsum.pdf
  2. найдите полный путь, используя

    String fileName = ClassLoader.getSystemResource ("lipsum.pdf"). GetFile ();

...