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

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

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

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

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

(Я фактически использую FilenameFilter, но я пытаюсь упростить.)

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

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

Ответ 1

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

Итак, как выглядит код, но поместите файл с именем 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", чтобы это сделать.

Ответ 2

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

//Obtains the folder of /src/test/resources
URL url = ClassLoader.getSystemResource("");
File folder = new File(url.toURI());
//List contents...

Ответ 3

Попробуй?

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

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

Ответ 4

  • поместите нужный ресурс в /src/test/resources/lipsum.pdf
  • найти полный путь, используя

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