Почему я не могу получить доступ к src / test / resources в тестовом запуске Junit с Maven?

У меня проблемы с запуском следующего кода:

configService.setMainConfig("src/test/resources/MainConfig.xml");

Изнутри метода Junit @Before.

Так Maven создает свою целевую папку?

45
задан Michael W 30 September 2011 в 16:29
поделиться

1 ответ

Я столкнулся с той же проблемой сегодня, и я нашел некоторые решения.

Первый, вот моя файловая структура:

.
└── 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).

Источники:

2
ответ дан 26 November 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: