我认为我的类路径设置遇到了错误。
我想测试一个国际化的网络应用程序,它的消息源定义如下:
<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。
答案 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测试中,您可以:
请注意,如果执行(2),则Spring有时会缓存系统属性的值,因此您无法随后更改系统属性。它使用原始值。