Использование ресурсов i18n из WEB-INF в тесте Junit - PullRequest
5 голосов
/ 05 сентября 2011

Кажется, я столкнулся с ошибкой в ​​настройках пути к классам.

Я хочу протестировать интернационализированное веб-приложение, для которого источник сообщений определен следующим образом:

<bean id="messageSource"
  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>/WEB-INF/i18n/errors</value>
            <value>/WEB-INF/i18n/messages</value>
            <value>/WEB-INF/i18n/links</value>
            <value>/WEB-INF/i18n/forms</value>
            <value>/WEB-INF/i18n/communication</value>
        </list>
    </property>
</bean>

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

Однако я хочу, чтобы они НЕ были в пути к классам, потому что тогда я смогу использовать функцию, где я могу что-то изменить в файлах свойств, и это немедленно отражается на сайте:

Приложение SpringContext находится там: /src/main/resources/spring/applicationContext.xml и загружен в тест Junit со следующими аннотациями:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/spring/applicationContext.xml"})

Как я могу заставить Junit забирать ресурсы, не относящиеся к классу? Файлы свойств находятся на /src/main/webapp/WEB-INF/i18n/*

Junit: 4,7.

Весна: 3.0.5.

Ответы [ 2 ]

6 голосов
/ 13 сентября 2011

Тем временем я исправил свою первоначальную проблему.

Решение Мэтью мне не помогло - все еще очень хороший вклад.И он не мог знать, что я использовал maven в своем проекте, так как я никогда не говорил.

Однако в maven я нашел решение своей проблемы:

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

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

3 голосов
/ 07 сентября 2011

Мне кажется, самое простое решение - просто использовать свойство, которое вы переопределяете при выполнении junit:

<bean id="messageSource"
  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>${path.prefix}/WEB-INF/i18n/errors</value>
            <value>${path.prefix}/WEB-INF/i18n/messages</value>
            <value>${path.prefix}/WEB-INF/i18n/links</value>
            <value>${path.prefix}/WEB-INF/i18n/forms</value>
            <value>${path.prefix}/WEB-INF/i18n/communication</value>
        </list>
    </property>
</bean>

Вы устанавливаете значение по умолчанию для этого в PropertyPlaceholderConfigurer

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="properties">
        <props>
            <prop key="path.prefix"></prop> <!-- empty -->
        </props>
    </property>
</bean>

Это определение bean-компонента propertyConfigurer должно находиться перед определением bean-компонента messageSource. В тестах junit вы можете:

  1. установить свойство с помощью другой версии propertyConfigurer, специфичной для ваших тестов, или
  2. установка системного свойства через -Doption в командной строке или System.setProperty ("path.prefix", "src / main / webapp") в вашем @Before.

Обратите внимание, что если вы делаете (2), то Spring иногда кэширует значения системных свойств, поэтому вы не можете впоследствии изменить системное свойство. Используется оригинальное значение.

...