Unit Test в Maven требуется доступ к директории src/main/webapp

Я пытаюсь использовать unit test webapp, который я разрабатываю в Maven/Eclipse. Это Spring MVC webapp, и мне нужны некоторые модульные тесты для тестирования моего контроллера модели.

Для этого мне нужно использовать мои файлы config.xml для webapp для ввода контроллера, однако вся моя конфигурация (и другие связанные файлы, которые ссылаются на конфиги) находятся в каталоге src/main/webapp (в соответствии с Maven соглашение) - здесь есть много файлов, которые мне нужно ссылаться в моих тестах, но они недоступны при запуске теста, поскольку они не находятся в пути к классам (Maven, похоже, только добавляет src/main/java, src/test/java, src/main/resources, src/test/resources для пути к классам, но не src/main/webapps)

Я не хочу копировать весь свой webapp в мою папку src/test/resources только для целей тестирования - есть ли другой способ получить к ним доступ?

Я могу обойти это, изменив Eclipse "Run Configurations", чтобы включить эту папку в путь к классам, но это не сработает при запуске тестов из командной строки?

Кто-нибудь еще столкнулся с этим? есть ли известное решение?

Спасибо!

Ответ 1

В общем, вы должны использовать mocks (например, EasyMock или jMock) для обработки модульного тестирования вашего контроллера; a unit test должен тестировать компонент отдельно от остальной системы. В Spring 3 вы можете определить свои контроллеры как POJO с аннотациями, а затем просто протестировать контроллеры без какого-либо взаимодействия с Spring вообще.

Если вы хотите выполнить большее тестирование уровня интеграции, вы можете разместить общие части конфигурационных файлов в src/main/resources, чтобы они стали доступными в пути к классам. Затем используйте тестовую конфигурацию в src/test/resources для вашего теста. Этот файл может либо импортировать эти файлы вместе с чем угодно, либо вы можете аннотировать ваш тестовый пример с помощью @ContextConfiguration, чтобы указать несколько файлов, необходимых для сборки контекста.

Для конкретного примера см. этот пост в блоге по тестированию интеграции Spring MVC. В главе главы тестирования Spring также есть достойный обзор тестирования интеграции в Spring.

Ответ 2

Первая ссылка Эмиля была правильной в отображении правильных местоположений @ContextConfiguration.

Если ваши файлы конфигурации Spring находятся в файле src/main/webapp/**, они не будут находиться в пути к классам, когда он будет создан Maven. Чтобы получить конфигурацию для тестирования интеграции, просто укажите путь, используя префикс file:.

@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/app-config.xml")

Если вы используете Spring плагин STS для создания нового проекта MVC Spring, вы заметите, что конфигурационные файлы контекста приложения помещаются в расположение моего примера. Способ использования их при тестировании интеграции должен указывать путь с использованием префикса file:, как описано выше.

Ответ 3

Вы можете достичь этого, используя maven-surefire-plugin, как показано ниже:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <additionalClasspathElements>
                <additionalClasspathElement>src\main\webapp\</additionalClasspathElement>
            </additionalClasspathElements>
        </configuration>
    </plugin>

Теперь вы можете получить доступ к вашему web.xml таким образом, например:

getClass().getClassLoader().getResourceAsStream("classpath:webapp/WEB-INF/web.xml")

Ответ 4

Чтобы сделать это, мне нужно использовать файлы .xml для конфигурации webapp для ввода контроллера, однако вся моя конфигурация (и другие связанные файлы, которые ссылаются на конфиги) находятся в каталоге src/main/webapp

Какие файлы нужны вам во время модульных тестов?

Я не хочу копировать весь свой webapp в мою папку src/test/resources только для целей тестирования - есть ли другой способ получить к ним доступ?

Нет. Если вы хотите, чтобы они находились в пути к классам, поместите их либо в src/main/resources, либо src/test/resources, файлы под src/main/webapp не находятся в пути к классам, потому что они не должны.