Как получить путь к каталогу src/test/resources в JUnit?



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



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


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

717   11  

11 ответов:

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

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

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

Javadoc для ClassLoader: http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html

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

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

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

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

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

Я бы просто использовать Path из Java 7

Path resourceDirectory = Paths.get("src","test","resources");

аккуратный и чистый!

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

File file = ResourceUtils.getFile(this.getClass().getResource("/some_file.txt"));

у меня есть проект Maven3 с использованием JUnit 4.12 и Java8. Для того, чтобы получить путь к файлу с именем 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. Ссылка здесь.

существуют различия и ограничения в вариантах, предлагаемых @Steve C и @ashosborne1. Я считаю, что они должны быть конкретизированы.

когда мы можем использовать: File resourcesDirectory = new File("src/test/resources");?

  • 1 когда тесты будут выполняться только через maven, но не через IDE.
  • 2.1 когда тесты будут выполняться через Maven или
  • 2.2 через IDE и только один проект импортируется в IDE. (Я использую термин "импортированный", потому что он используется в IntelliJ IDEA. Я думаю, что пользователи eclipse также импортируйте их проект maven). Это будет работать, потому что рабочий каталог при запуске тестов через IDE совпадает с вашим проектом.
  • 3.1 когда тесты будут выполняться через Maven или
  • 3.2 через IDE, и более одного проекта импортируются в IDE (когда вы не студент, вы обычно импортируете несколько проектов),и перед запуском тестов через IDE необходимо вручную настроить рабочий каталог для тестов. Этот рабочий каталог должен ссылаться на ваш импортированный проект, содержащий тесты. По умолчанию рабочий каталог всех проектов, импортированных в IDE, является только одним. Вероятно, это ограничение IntelliJ IDEA только, но я думаю, что все IDE работают так. И эта конфигурация, которую нужно сделать вручную, совсем не хороша. Работа с несколькими тестами, существующими в разных проектах maven, но импортированными в один большой проект "IDE", заставляет нас помнить об этом и не позволяет расслабиться и получить удовольствие от вашего работа.

решение, предлагаемое @ashosborne1 (лично я предпочитаю этот), требует 2 дополнительных требования, которые необходимо выполнить перед запуском тестов. Вот список шагов для использования этого решения:

  • создайте тестовую папку ("teva") и файл ("readme") внутри"src/test/resources/":

    src / test / resources/teva / readme

    файл должен быть создан в тестовой папке, иначе он не будет работать. Maven игнорирует пустая папка.

  • хотя бы один раз построить проект через mvn clean install. Он также будет выполнять тесты. Может быть достаточно запустить только ваш тестовый класс / метод через maven без создания целого проекта. В результате ваши тестовые ресурсы будут скопированы в тестовые классы, вот путь:target/test-classes/teva/readme
  • после этого вы можете получить доступ к папке с помощью кода, уже предложенного @ashosborne1 (извините, что я не смог отредактировать этот код внутри этого списка элементов правильно):
public static final String TEVA_FOLDER = "teva"; ... 
URL tevaUrl = YourTest.class.getClassLoader().getResource(TEVA_FOLDER); 
String tevaTestFolder = new File(tevaUrl.toURI()).getAbsolutePath();

теперь вы можете запускать свой тест через IDE столько раз, сколько хотите. Пока вы не запустите mvn clean. Это приведет к удалению целевой папки.

создание файла внутри тестовой папки и запуск maven в первый раз, перед запуском тестов через IDE необходимы шаги. Без этих шагов, если вы только в своей IDE создаете тестовые ресурсы, а затем пишете тест и запускаете его только через IDE, вы получите ошибку. Тесты по МВН копии тестовых ресурсов в target/test-classes/teva / readme и они становятся доступными для загрузчика классов.

вы можете спросить, почему мне нужно импортировать более одного проекта maven в IDE и почему так много сложных вещей? Для меня одна из главных мотиваций: хранить файлы, связанные с IDA, вдали от кода. Сначала я создаю новый проект в своей среде IDE. Это поддельный проект, который является просто держателем файлов, связанных с IDE. Затем я импортирую уже существующие проекты maven. Я заставляю эти импортированные проекты хранить файлы идей в моем оригинале только поддельный проект. В результате я не вижу связанных с IDE файлов среди кода. SVN не должен их видеть (не предлагайте настроить svn/git, чтобы игнорировать такие файлы, пожалуйста). И это просто очень удобно.

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

используйте следующее, чтобы ввести 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/test/resources копируется в . Поэтому, чтобы получить файл из тестовых ресурсов во время сборки maven, вы должны загрузить его из , вот так:

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

сломать:

  1. getClass().getProtectionDomain().getCodeSource().getLocation().toURI() - дайте вам URI to target/test-classes.
  2. resolve(Paths.get("somefile")) - устранена someFile до .

оригинальный ответ принимается от этой

использовать .getAbsolutePath () для объекта File.

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

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

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

  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;
    }

}

Comments

    Ничего не найдено.