Я знаю, что могу загрузить файл из src / test / resources с помощью:

getClass().getResource("somefile").getFile()

Но как я могу получить полный путь к каталогу src / test / resources , т.е. я не хочу загружать файл, я просто хочу знать путь к каталогу?

308
Rory 23 Фев 2015 в 15:18

13 ответов

Лучший ответ

Попробуйте поработать с классом ClassLoader:

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("somefile").getFile());
System.out.println(file.getAbsolutePath());

ClassLoader отвечает за загрузку в классах. Каждый класс имеет ссылку на ClassLoader. Этот код возвращает File из каталога ресурсов. Вызов getAbsolutePath() возвращает его абсолютное значение Path.

Документация Javadoc для ClassLoader: http: // docs .oracle.com / javase / 7 / docs / api / java / lang / ClassLoader.html.

220
aboger 6 Май 2018 в 17:44

С Spring вы можете использовать это:

import org.springframework.core.io.ClassPathResource;

// Don't worry when use a not existed directory or a empty directory
// It can be used in @before
String dir = new ClassPathResource(".").getFile().getAbsolutePath()+"/"+"Your Path";
0
kyakya 23 Окт 2020 в 09:33

Используйте следующее, чтобы внедрить Hibernate с Spring в свои модульные тесты:

@Bean
public LocalSessionFactoryBean getLocalSessionFactoryBean() {
    LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
    localSessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
    localSessionFactoryBean.setPackagesToScan("com.example.yourpackage.model");
    return localSessionFactoryBean;
}

Если у вас нет hibernate.cfg.xml в папке src/test/resources, он автоматически вернется к папке в вашей папке src/main/resources.

0
whitebrow 31 Янв 2018 в 08:12
List<String> lines = Files.readAllLines(Paths.get("src/test/resources/foo.txt"));
lines.forEach(System.out::println);
1
nader.h 16 Июн 2020 в 10:34

С помощью Spring вы можете легко прочитать его из папки ресурсов (main / resources или test / resources):

Например, создайте файл: test/resources/subfolder/sample.json

@Test
public void testReadFile() {
    String json = this.readFile("classpath:subfolder/sample.json");
    System.out.println(json);
}

public String readFile(String path) {
    try {
        File file = ResourceUtils.getFile(path);
        return new String(Files.readAllBytes(file.toPath()));
    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}
1
MevlütÖzdemir 8 Янв 2020 в 09:14

Используйте .getAbsolutePath () для объекта File.

getClass().getResource("somefile").getFile().getAbsolutePath()
1
OneCricketeer 6 Июл 2018 в 21:52

В общем случае нельзя использовать файл из папки ресурсов для тестов. Причина в том, что файлы ресурсов в папке ресурсов хранятся внутри jar. Таким образом, у них нет реального пути в файловой системе.

Самым простым решением может быть:

  1. Скопируйте файл из ресурсов во временную папку и получите путь к этому временному файлу.
  2. Сделайте тесты, используя временный путь.
  3. Удалить временный файл.

TemporaryFolder из JUnit можно использовать для создания временных файлов и удаления их после завершения теста. Классы из библиотеки guava используются для копирования папки ресурсов файловой формы.

Обратите внимание, что если мы используем подпапку в папке ресурсов, например good, нам не нужно добавлять ведущий / к пути к ресурсу.

public class SomeTest {

    @Rule
    public TemporaryFolder tmpFolder = new TemporaryFolder();


    @Test
    public void doSomethinge() throws IOException {
        File file = createTmpFileFromResource(tmpFolder, "file.txt");
        File goodFile = createTmpFileFromResource(tmpFolder, "good/file.txt");

        // do testing here
    }

    private static File createTmpFileFromResource(TemporaryFolder folder,
                                                  String classLoaderResource) throws IOException {
        URL resource = Resources.getResource(classLoaderResource);

        File tmpFile = folder.newFile();
        Resources.asByteSource(resource).copyTo(Files.asByteSink(tmpFile));
        return tmpFile;
    }

}
2
v.ladynev 21 Июн 2019 в 10:32

Самое простое и чистое решение, которое я использую, предположим, что имя тестового класса - TestQuery1, а в вашей папке test есть каталог resources, как показано ниже:

├── java
│   └── TestQuery1.java
└── resources
    └── TestQuery1
        ├── query.json
        └── query.rq

Чтобы получить URI TestQuery1, выполните:

URL currentTestResourceFolder = getClass().getResource("/"+getClass().getSimpleName());

Чтобы получить URI одного из файлов TestQuery1, выполните:

File exampleDir = new File(currentTestResourceFolder.toURI());
URI queryJSONFileURI = exampleDir.toURI().resolve("query.json");
5
Noor 18 Мар 2017 в 13:21

Все содержимое в src/test/resources копируется в папку target/test-classes. Итак, чтобы получить файл из тестовых ресурсов во время сборки maven, вам нужно загрузить его из папки test-classes, например:

Paths.get(
    getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
).resolve(
    Paths.get("somefile")
).toFile()

Сломать:

  1. getClass().getProtectionDomain().getCodeSource().getLocation().toURI() - дать вам URI для target/test-classes.
  2. resolve(Paths.get("somefile")) - преобразует someFile в папку target/test-classes.

Исходный ответ взят из этого

12
OneCricketeer 6 Июл 2018 в 21:51

У меня есть проект Maven с использованием JUnit 4.12 и Java 8. Чтобы получить путь к файлу с именем myxml.xml в src/test/resources, я делаю это из тестового примера:

@Test
public void testApp()
{
    File inputXmlFile = new File(this.getClass().getResource("/myxml.xml").getFile());
    System.out.println(inputXmlFile.getAbsolutePath());
    ...
}

Протестировано на Ubuntu 14.04 с IntelliJ IDE. См. здесь.

15
Antony 27 Апр 2016 в 10:34

Если это весенний проект, мы можем использовать приведенный ниже код для получения файлов из папки src / test / resource .

File file = ResourceUtils.getFile(this.getClass().getResource("/some_file.txt"));
28
Paramesh Korrakuti 31 Авг 2016 в 07:17

Не нужно возиться с загрузчиками классов. На самом деле это плохая привычка, потому что ресурсы загрузчика классов не java.io.File объектами, когда они находятся в jar-архиве.

Maven автоматически устанавливает текущий рабочий каталог перед запуском тестов, поэтому вы можете просто использовать:

    File resourcesDirectory = new File("src/test/resources");

resourcesDirectory.getAbsolutePath() вернет правильное значение, если оно вам действительно нужно.

Я рекомендую создать каталог src/test/data, если вы хотите, чтобы ваши тесты получали доступ к данным через файловую систему. Это дает понять, что вы делаете.

311
Steve C 23 Фев 2015 в 13:13