Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设置JUnit Runner(Eclipse)的系统属性以测试SpringWeb应用程序_Java_Eclipse_Spring_Junit_System Properties - Fatal编程技术网

Java 设置JUnit Runner(Eclipse)的系统属性以测试SpringWeb应用程序

Java 设置JUnit Runner(Eclipse)的系统属性以测试SpringWeb应用程序,java,eclipse,spring,junit,system-properties,Java,Eclipse,Spring,Junit,System Properties,我们的web应用程序使用SystemPropertyPlaceholder根据系统属性的值加载属性文件(见下文) 本地运行它的默认设置存储在application.properties中。在生产服务器上,我们目前只需在部署应用程序之前将“env”设置为“production”,它将加载production.properties 现在测试应用程序时,应使用test.properties文件 如果我运行jenkins构建中的所有测试,添加-Denv=test将按预期工作。但是,如果我只想在Eclip

我们的web应用程序使用SystemPropertyPlaceholder根据系统属性的值加载属性文件(见下文)

本地运行它的默认设置存储在
application.properties
中。在生产服务器上,我们目前只需在部署应用程序之前将“env”设置为“production”,它将加载
production.properties

现在测试应用程序时,应使用
test.properties
文件

如果我运行jenkins构建中的所有测试,添加
-Denv=test
将按预期工作。但是,如果我只想在Eclipse中使用集成的JUnit runner运行一个测试,该怎么办

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = WebContextLoader.class, locations = {"classpath:application-context.xml" })
public class SomeTest {
有没有办法告诉我的测试在加载Spring之前应该将系统属性“env”设置为“test”呢?因为使用
MethodInvokingFactoryBean
只会因为某种原因在之后设置它,即使我在加载属性文件之前设置了它:

<bean id="systemPrereqs"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" value="#{@systemProperties}" />
    <property name="targetMethod" value="putAll" />
    <property name="arguments">
        <!-- The new Properties -->
        <util:properties>
            <prop key="env">test</prop>
        </util:properties>
    </property>
</bean>

<bean
    class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="searchContextAttributes" value="true" />
    <property name="contextOverride" value="true" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
        <list>
            <value>classpath:application.properties</value>
            <value>classpath:${env}.properties</value>
            <value>${config}</value>
        </list>
    </property>
</bean>

<bean id="managerDataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="username">
        <value>${database.username}</value>
    </property>
    <property name="password">
        <value>${database.password}</value>
    </property>
    <property name="url">
        <value>${database.url}</value>
    </property>

</bean>

测试
类路径:application.properties
类路径:${env}.properties
${config}
${database.username}
${database.password}
${database.url}
在application.properties、production.properties和test.properties中定义了数据库属性

问题是,我当然希望对所有环境使用相同的上下文文件,否则我可以告诉我的测试使用不同的上下文,在这里我将PropertyPlaceholder属性“location”设置为test.properties。。。但我希望我的测试也能覆盖我的上下文,以便尽早发现任何错误(我正在使用SpringWebMVC对我们的web应用程序进行端到端测试,它加载整个web应用程序,提供一些很好的反馈,我不想失去这一点)


到目前为止,我能看到的唯一方法可能是将JUnit runner配置为包含一些系统属性设置参数,尽管我不知道如何做到这一点。

我现在正在处理完全相同的问题,希望找到解决方法。您可以将
System.setProperty()
调用到测试用例的静态初始值设定项中。

在Eclipse中,右键单击JUnit测试类,选择Run As>Run Configurations…,然后转到Arguments选项卡,并在VM Arguments下添加System属性条目,例如,-Dcatalina.base=C:\programs\apache-tomcat-7.0.32

您可以尝试使用属性让调用bean的方法在其他方法运行之前运行

我想说,在这些配置文件中使用配置文件导入您需要的适当文件。看起来你正在重新发明轮子。使用profile,您只需将
@ActiveProfiles
添加到您的测试用例中,即可加载适当的内容。相反,您可以使用
-Denv=test
,然后使用
-Dspring.active.profiles=test
,虽然这在运行单个测试时有效,但在运行多个测试时可能不一定有效,因为Spring上下文可以在多个测试中重用。@pimlott,IMHO运行多个测试在这种情况下不会导致任何问题。关键是我们必须在初始化spring上下文之前设置系统属性。这是通过使用静态初始值设定项实现的。如果共享相同spring上下文的所有测试用例都设置了此属性(即情况),则spring上下文将正确初始化。是的,我同意,如果共享该上下文的每个测试类中都存在静态初始值设定项。这在某些情况下可能不可行。默认情况下,是否有任何方法可以对所有测试执行此操作,因此您不必为每个测试手动设置此属性?