在Junit测试中使用来自WEB-INF的i18n资源

时间:2011-09-05 15:48:42

标签: spring junit classpath

我认为我的类路径设置遇到了错误。

我想测试一个国际化的网络应用程序,它的消息源定义如下:

<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 Test时,它无法解析这些属性文件,因为它们不在类路径中。

但是,我希望它们不在类路径上,因为我可以利用我可以在属性文件中更改内容的功能,并立即反映在网站上:Since application servers typically cache all files loaded from the classpath, it is necessary to store resources somewhere else (for example, in the "WEB-INF" directory of a web app). Otherwise changes of files in the classpath will not be reflected in the application.

spring applicationContext位于那里:/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 个答案:

答案 0 :(得分:6)

我在此期间解决了我的初始问题。

马修的解决方案对我没有帮助 - 仍然是非常好的输入。 因为我从未说过,他无法知道我在项目中使用了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>

我配置了surefire-plugin以获取类路径的其他元素。

答案 1 :(得分:3)

在我看来,最简单的解决方案就是使用在执行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>

此propertyConfigurer bean定义需要在messageSource bean定义之前。在junit测试中,您可以:

  1. 使用特定于您的测试的不同版本的propertyConfigurer设置属性,或
  2. 在命令行中通过-Doption设置系统属性,或在 @Before 中通过System.setProperty(“path.prefix”,“src / main / webapp”)设置系统属性。
  3. 请注意,如果执行(2),则Spring有时会缓存系统属性的值,因此您无法随后更改系统属性。它使用原始值。