2009-07-15 3 views
17

В Maven у вас может быть времени компиляции зависимостей и test зависимостей. Это особенность, которую я люблю, и плагин M2Eclipse делает это доступным в Eclipse, и это здорово. Поэтому, если я добавлю jmock.jar в свой проект как тестовую зависимость, он будет отображаться на пути к классам для тестов JUnit, но не будет присутствовать, когда я отлажу сам приложение.Записи типа Eclipse, используемые только для тестов

Это именно то, чего я хотел бы достичь сейчас, но без M2Eclipse или Maven. Есть ли способ сделать это в простом Eclipse? (. Возможно, без установки каких-либо плагинов)

ответ

10

Вы можете разделить все ваши тесты в другой проект и добавить основной проект в качестве зависимости (Проект-> Свойства ->Java Построить Путь ->Проекты ->Добавить ...)

Обновление: Чтобы избежать изменения исходной структуры проекта, ваши тестовые проекты могут использовать связанные местоположения.

Создайте тестовый проект как обычно, теперь вам нужно создать связанный ресурс, чтобы вставить папку src/test/java. Лучше всего создать его с помощью переменной, чтобы ваши проекты могли сохранять определенную независимость от платформы. Чтобы создать новую связанную папку выберите New ->Папка, вход ЦСИ имени в папке : поле и нажмите Дополнительно >>

Нажмите Ссылка на папку в файловой системе Нажмите на Переменные ..., чтобы открыть Выбрать путь Переменная диалог.

Если это ваш первый визит или вы собираетесь в новое местоположение, выберите Новый ... и введите переменную разумное имя и путь. Если все ваши проекты расположены в c: \ workspaces \ foo **, имеет смысл вызвать переменную ** WORKSPACE_ROOT и указать ей этот путь. Если у вас есть какое-то другое соглашение, это нормально, но имеет смысл поставить комментарий в файл .project, чтобы у кого-то появилась возможность выяснить, каково должно быть правильное значение.

Предполагая, что значения выше теперь вы можете установить значение WORKSPACE_ROOT/[при условии название проекта]/Src на поле

ввода После того, как вы подтвердите, что вы должны увидеть папку Src с маленькой стрелкой, и если вы посмотрите в .project файле увидеть что-то вроде этого:

<linkedResources> 
    <link> 
     <name>src</name> 
     <type>2</type> 
     <locationURI>WORKSPACE_ROOT/esf-ns-core-rp/src</locationURI> 
    </link><!--NOTE the WORKSPACE_ROOT variable points to the folder containing the subject project's sandbox--> 
</linkedResources> 

Теперь вы можете добавить папку SRC/тест/Java в качестве исходного местоположения в обычном режиме.

Примечание Вы также можете поделиться только папку SRC/тест/Java, изменив конфиг-то вроде этого:

<linkedResources> 
    <link> 
     <name>src/test/java</name> 
     <type>2</type> 
     <locationURI>WORKSPACE_ROOT/my-project/src/test/java</locationURI> 
    </link> 
</linkedResources> 

Это дает больший контроль над конфигурации, но вам придется повторить для SRC/тест/ресурсы, src/it/java и т. д.

Затем вы устанавливаете все тестовые зависимости только в тестовом проекте.

Очень не красиво, но он работает (я также использовал это, когда уровень соответствия теста отличается от основного уровня соответствия, например, 1,5 для тестов, но 1,4 для целевой среды).

+0

Я делаю это в большом приложении, разработанном многими людьми. Я надеюсь, что мы скоро перейдем в Maven, поэтому я бы не прочь проглотить трюки (которые можно удалить, когда мы на Maven/M2Eclipse), но изменив структуру проекта, которая на данный момент выходит за рамки. –

+0

Я бесстыдно скопировал некоторые части вашего ответа в своем (http://stackoverflow.com/questions/1470827/external-output-folder-in-eclipse/1470833#1470833), поэтому +1;) – VonC

0

Фактически, если вы заглянете в затмение относительно того, как Maven интегрирует зависимости, это не повлияет на зависимости тестов или времени выполнения, ваши тестовые библиотеки всегда доступны.

Maven будет сохранять разницу при упаковке приложения и когда он генерирует путь к классам выполнения, если maven контролирует выполнение этой части. Когда затмение касается, Maven просто добавляет их все без вопросов к пути сборки eclipse.

Почему вам нужно, чтобы это разделилось так? Что это поможет вам добиться успеха?

+3

Это, как вы описали если вы не используете плагин M2Eclipse. Но с установленным плагином действительно задействованы области зависимостей. Мне понадобится это разделение, потому что я хотел бы использовать отдельные реализации протоколирования для тестирования и для выполнения. Поскольку SLF4J использует SPI для определения фактической реализации, я не думаю, что добавление двух из них в classpath было бы хорошей идеей. –

+0

Я предполагаю, что создатель maven делает больше магии, чем рекламируется тогда. Ну, на основе того, что я вижу здесь, ваш лучший вариант на данный момент (пока вы не получите Maven) не будет взломать вашу структуру проекта, как указано выше, сохраняя при этом вашу структуру папок неповрежденной. В этом случае, если это уже не так, вы можете начать сразу же, чтобы обеспечить соблюдение правила компоновки maven, это облегчит переход позже. – Newtopian

+0

Я не знал о библиотеке SLF4J ... спасибо .. Я использовал для создания своей собственной оболочки, хотя мои потребности скромны, я никогда не искал других решений. спасибо – Newtopian

1

Поскольку вы используете Eclipse, как и Maven вы можете временное решение. Создайте новую конфигурацию запуска «Maven Build» с целью «exec: java» и параметрами «exec.mainClass = com.example.Starter». Таким образом, путь к классам будет рассчитан Maven.

+0

Это 4-летний ответ, но я использую STS 3.6.4 (Luna 4.4.2), и у него есть проблема, и это обходное решение отлично. В моих тестах у меня есть фиктивный @Service, который реализует тот же интерфейс, что и реальный, и когда пакеты eclipse в тестовых классах Spring не могут выбрать, какую реализацию сервиса использовать. «ожидаемый единичный компонент соответствия, но найден 2." – Jim