Файлы ресурсов не найдены в тестовых примерах JUnit

Summary

Мои тесты JUnit не находят файлы, которые им требуются во время выполнения. Я использую Maven для управления и компиляции зависимостей.

Details

Все файлы, необходимые для тестовых случаев, находятся в:src/test/resources.

Например,src/test/resources/resourceFile.txt.

Для доступа к ресурсу я использую следующий код:

<code>URL url = getClass().getResource("/resourceFile.txt").getFile();
File file = new File(url);
</code>

Но потомfile.exists() возвращаетсяfalse, И ошибка, которую я получаю:

<code>Tests in error: 
  myJUnitTestCase(tests.MyJUnitTestClass): /home/me/workspace/Project%20Name/target/test-classes/resourceFile.txt (No such file or directory)
</code>

Обратите внимание, что следующее дает ту же ошибку (обратите внимание на удаленный/ префикс):

<code>URL url = getClass().getClassLoader().getResource("resourceFile.txt").getFile();
File file = new File(url);
</code>

Кажется, что файлы изsrc/test/resources не копируются вtarget/test-classes.

Есть идеи?

The following questions did not help

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

Загрузка файла свойств в JUnit @BeforeClass

Как бороться с тестовыми данными в Junit?

Software Versions

Ubuntu 12.04

Apache Maven 2.2.1

Java 1.7.0

Eclipse (Java EE IDE для веб-разработчиков), Indigo Service Release 2

(truncated) Maven POM

<code><?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.groupId</groupId>
    <artifactId>artifactId</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>name</name>
    <build>
        <finalName>name</finalName>
        <directory>target</directory>
        <outputDirectory>target/classes</outputDirectory>
        <testOutputDirectory>target/test-classes</testOutputDirectory>
        <sourceDirectory>src/main/java</sourceDirectory>
        <testSourceDirectory>src/test/java</testSourceDirectory>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
            </testResource>
        </testResources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
</code>
 Alex Averbuch10 мая 2012 г., 16:58
Я пытаюсь открыть его как файл. Мое решение теперь: org.apache.commons.io.FileUtils.toFile (myClass (). GetResource (& quot; resourceFile.txt & quot;));
 ftr10 мая 2012 г., 17:17
Это может быть пробел (% 20) на пути, который может привести к любым неприятностям;)
 Alex Averbuch10 мая 2012 г., 16:38
Нет, я идиот ... прости. Я только что проверил, и я могу подтвердить, что они действительно скопированы там. Может быть, это из-за "% 20" в пути?
 ftr10 мая 2012 г., 16:32
It seems as though the files from src/test/resources are not getting copied into target/test-classes Вы на самом деле это подтвердили?
 John Ericksen10 мая 2012 г., 16:47
Вы пытаетесь открыть поток ввода из этого файла? Если это так, вы можете напрямую использовать следующее (вместо использования URL): .class.getClassLoader (). GetResourceAsStream (fileName)

Ответы на вопрос(3)

Решение Вопроса

Моя ошибка, файлы ресурсов были на самом деле скопированы вtarget/test-classes. The problem seemed to be due to spaces in my project nameнапример,Project%20Name.

Сейчас я загружаю файл следующим образом, и он работает:

org.apache.commons.io.FileUtils.toFile(myClass().getResource("resourceFile.txt")‌​);

Или (взято изJava: как получить файл с экранированного URL?) это может быть лучше (не зависит от Apache Commons):

myClass().getResource("resourceFile.txt")‌​.toURI();
 13 мая 2012 г., 21:42
На самом деле, этот вопрос отвечает на то, что:stackoverflow.com/questions/2166039/…

Вы знаете, что Maven основан наConvention over Configuration pardigm? поэтому вы не должны настраивать параметры, которые являются настройками по умолчанию.

Все эти вещи представляют собой настройки по умолчанию в Maven. Таким образом, лучшая практика не определяет это, это уже сделано.

    <directory>target</directory>
    <outputDirectory>target/classes</outputDirectory>
    <testOutputDirectory>target/test-classes</testOutputDirectory>
    <sourceDirectory>src/main/java</sourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
        </testResource>
    </testResources>
 Alex Averbuch11 мая 2012 г., 00:44
Спасибо за чаевые. причина, по которой я добавил это, в том, что я совершенно неопытен в Maven, поэтому я хотел сделать вещи явными (убрать магию) ... но я буду удалять ненужную конфигурацию в будущем.
 25 янв. 2013 г., 23:42
Вы уверены, что поведение, запрошенное @AlexAverbuch, действительно по умолчанию в mvn?
 04 дек. 2013 г., 13:31
Если вы используете Tycho и eclipse-plugin в качестве типа упаковки, не забудьте добавить add src / test / resources в файл build.properties.

Это на самом деле избыточно, за исключением случаев, когда вы хотите переопределить значения по умолчанию. Все эти настройки подразумевают значения по умолчанию.

Вы можете проверить это, проверив действующий POM с помощью этой команды

mvn help:effective-pom

    <finalName>name</finalName>
    <directory>target</directory>
    <outputDirectory>target/classes</outputDirectory>
    <testOutputDirectory>target/test-classes</testOutputDirectory>
    <sourceDirectory>src/main/java</sourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
        </testResource>
    </testResources>

Например, если я хочу указать другой путь к тестовому ресурсу или путь к ресурсу, вы должны использовать это, в противном случае вы не используете.

    <resources>
        <resource>
            <directory>/home/josh/desktop/app_resources</directory>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>/home/josh/desktop/test_resources</directory>
        </testResource>
    </testResources>

Ваш ответ на вопрос