Вопрос по maven, java – Файлы ресурсов не найдены в тестовых примерах JUnit

60

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>
It seems as though the files from src/test/resources are not getting copied into target/test-classes Вы на самом деле это подтвердили? ftr
Я пытаюсь открыть его как файл. Мое решение теперь: org.apache.commons.io.FileUtils.toFile (myClass (). GetResource (& quot; resourceFile.txt & quot;)); Alex Averbuch
Это может быть пробел (% 20) на пути, который может привести к любым неприятностям;) ftr
Нет, я идиот ... прости. Я только что проверил, и я могу подтвердить, что они действительно скопированы там. Может быть, это из-за "% 20" в пути? Alex Averbuch
Вы пытаетесь открыть поток ввода из этого файла? Если это так, вы можете напрямую использовать следующее (вместо использования URL): .class.getClassLoader (). GetResourceAsStream (fileName) John Ericksen

Ваш Ответ

3   ответа
40

Моя ошибка, файлы ресурсов были на самом деле скопированы в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();
На самом деле, этот вопрос отвечает на то, что:stackoverflow.com/questions/2166039/…
11

Вы знаете, что 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>
Если вы используете Tycho и eclipse-plugin в качестве типа упаковки, не забудьте добавить add src / test / resources в файл build.properties.
Спасибо за чаевые. причина, по которой я добавил это, в том, что я совершенно неопытен в Maven, поэтому я хотел сделать вещи явными (убрать магию) ... но я буду удалять ненужную конфигурацию в будущем. Alex Averbuch
Вы уверены, что поведение, запрошенное @AlexAverbuch, действительно по умолчанию в mvn?
1

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

Вы можете проверить это, проверив действующий 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>

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