У меня проблемы с запуском следующего кода:
configService.setMainConfig("src/test/resources/MainConfig.xml");
Изнутри метода Junit @Before.
Так Maven создает свою целевую папку?
Я столкнулся с той же проблемой сегодня, и я нашел некоторые решения.
Первый, вот моя файловая структура:
.
└── src
│ └── test
│ ├── java
│ │ └── mypackage
│ │ └── MyClassTest.java
│ └── resources
│ └── image.jpg
└── target
└── test-classes
├── image.jpg
└── mypackage
└── MyClassTest.class
, Что не работает: (Java 11 synthax)
var imgFile = new File("image.jpg"); // I was expecting that Junit could find the file.
var absPath = file.getAbsolutePath(); // /home/<user>/../<project-root>/image.jpg
var anyFileUnderThisPath = file.exists(); // false
то, Что мы можем заметить, - то, что полный путь не указывает вообще на моем изображении! Но если бы у меня было изображение под в корне проекта, затем он работал бы.
Решение 1: Пути (представленный в Java 7)
var relPath = Paths.get("src", "test", "resources", "image.jpg"); // src/test/resources/image.jgp
var absPath = relPath.toFile().getAbsolutePath(); // /home/<user>/../<project-root>/src/test/resources/image.jpg
var anyFileUnderThisPath = new File(absPath).exists(); // true
, Как мы видим, это указывает на правильном файле.
Решение 2: ClassLoder
var classLoader = getClass().getClassLoader();
var url = classLoader.getResource("image.jpg"); // file:/home/<user>/../<project-root>/target/test-classes/image.jpg
var file = new File(url.getFile()); // /home/<user>/../<project-root>/target/test-classes/image.jpg
var anyFileUnderThisPath = file.exists(); // true
Примечание, что теперь файл ищется в соответствии с целевым каталогом! и это работает.
Решение 3: Файл (Адаптация нерабочего примера)
var absPath = new File("src/test/resources/image.jpg").getAbsolutePath();
var var anyFileUnderThisPath = new File(absPath).exists(); // true
, Который работает также после взятия полного пути и помещения src/test/resources/
как префикс.
Сводка
Все три работы решений, но имеющий необходимость поместить src/test/resources/
по моему собственному мнению, не изящному, и это - то, почему я предпочел бы 2-е решение (ClassLoader
).
Источники: