Как я могу найти файлы тестовых ресурсов в проекте 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();