2009-03-11 5 views
17

Для запуска моих модульных тестов на моем Eclipse мне нужно установить некоторые свойства для виртуальной машины.Автоматически добавлять свойства при запуске JUnit в Eclipse

Таким образом, когда я впервые запускаю свой тест JUnit, я перехожу в «Open Run Dialog», а затем в настройке JUnit для этого теста я перехожу на вкладку «Аргументы» и помещаю все, что мне нужно, в «аргументы VM», текстовой области.

Есть ли способ автоматически добавить набор свойств при запуске моего JUnit, поэтому я смогу только щелкнуть правой кнопкой мыши на тестовом классе и нажать «Запустить как> Тест« Junit »для запуска теста ?

Техническая информация: Eclipse, 3.3.2, JUnit 4, Java 5


Edit, относительно ответа от Аарона Digulla:

Эти свойства используются в файлах конфигурации Spring *. Таким образом, я не могу использовать идею, данную Аароном, поскольку Spring будет инициализирован до запуска теста.

В дополнение к этому, мне просто нужно знать, могу ли я легко достичь этого в Eclipse. Таким образом, решение не должно влиять на компиляцию приложения вне Eclipse, так как мое приложение, наконец, будет скомпилировано (и протестировано) Maven2.

* Несколько «единиц» тестов действительно нуждаются в моей конфигурации пружины для запуска. Хорошо, я знаю, что это не настоящие модульные тесты; o)

Редактировать 2: Фактически, я действительно начал настройку пружины с помощью тестового блока. Таким образом, перед началом Spring я проверяю свойства System, и если мои свойства не установлены, тогда я даю им требуемое значение ...

Однако, я немного разочарован тем, что Eclipse не может сделать это для меня автоматически ...

+0

Просто быть явно относительно весенних испытаний. О чем говорит OP при использовании пружины, является «RunWith (SpringJUnit4ClassRunner.class) и ContextConfiguration» начнется весна до того, как будет запущен обычный Junit Before и BeforeClass, поэтому настройки системных свойств в них не будут работать. – sMoZely

ответ

7

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

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

[EDIT] Вы говорите, что весна инициализирована до запуска тестов. Это ошибка в вашем проекте: это должны быть те тесты, которые инициализируют Spring. В противном случае вы всегда столкнетесь с проблемой, что вам нужно проверить что-то вне вашего контроля.

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

В качестве альтернативы, убедитесь, что среда настроена правильно в setUp() и выдает ошибку, если свойство отсутствует. Таким образом, вы, по крайней мере, знаете, почему тесты не удастся позже. Но я все же предпочитаю иметь полный контроль, когда какая подсистема оживает. Все остальное просто просит бедствия.

+0

Я не могу использовать вашу идею, как объяснялось в моем Редактировании (я не уменьшаю его, так как это не плохая идея, однако) ... – romaintaz

+2

Я согласен со статическим блоком кода init. Существует еще одна альтернатива: @BeforeClass для метода, в котором вы можете инициализировать свои системные переменные. – zeratul021

7

Когда я хочу установить некоторые свойства записи для моего тестирования JUnit я реализовать следующие

protected void setUp() throws Exception { 
     super.setUp(); 

     System.setProperty("Property1", "value1"); 
     System.setProperty("Property2", "value2"); 
} 

Свойства устанавливаются перед тестом Methode называется

EDIT: Вы также можете прочитать свойства из файла и в свойствах системы

+0

То же замечание, что и для ответа Аарона Дигуллы. Он не будет работать, если свойства используются Spring ... – romaintaz

+0

Вы должны инициализировать все значения и объекты внутри метода установки. В противном случае обновите тестовые файлы. –

1

Я никогда не понимал, почему конфигурации запуска имеют способ определить переменные среды, но единственным способом добавления системного свойства является добавление аргументов vm ,

Способ, которым я работал, состоит в том, чтобы проверить тесты (или базовый класс абстрактных тестов) на наличие необходимых свойств, если их там нет, я загружаю их из файла .properties в пути к классам ,

Это работает, поскольку я все еще могу переопределить их или указать их из ANT или Maven, но также может «щелкнуть правой кнопкой мыши» -> Запустить как -> Junit Проверить отдельные тестовые файлы.

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

<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location" value="database.properties"/> 
     <property name="ignoreResourceNotFound" value="true" /> 
     <property name="systemPropertiesMode"> 
      <util:constant static-field="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
     </property> 
</bean> 
26

Вы могли бы попробовать это - пойти в

Window->Preferences->Java->Installed JREs 

анс выберите используемого JVM, чем использовать «prameter» по умолчанию VM, например

-DrunningInEclipse 

Чем вы можете проверить в вашем TestCase:

System.getProperty("runningInEclipse") != null 
+0

Это работает! Большой! – Wolfgang

+0

Фантастический! Благодарю. –

+0

Можно ли указать это для каждого проекта? – Stewart

1

Согласованный используется метод, таким образом, в одном из моих тестов JUnit, и она работала

 


    @BeforeClass 
     public static void setupProperties() { 
      System.setProperty("catalina.base", "C:\\sam-tomcat-7.0.42"); 
     } 

+0

Я знаю это решение, но оно не соответствовало моим требованиям. Я хотел иметь решение только для Eclipse. Используя это, это повлияет на сборку по умолчанию Maven (т.е. вне среды IDE). Кроме того, он работает только для одного класса (или вам нужно, чтобы все ваши тесты расширили класс, который определяет этот '@ BeforeClass'). – romaintaz