Legen Sie die Systemeigenschaft für JUnit Runner (Eclipse) fest, um eine Spring-Webanwendung zu testen

Unsere Web-App verwendet SystemPropertyPlaceholder, um Eigenschaftendateien abhängig vom Wert einer Systemeigenschaft zu laden (siehe unten).

Das Standard-Setup für die lokale Ausführung ist in gespeichertapplication.properties. Auf dem Produktionsserver setzen wir "env" gerade auf "production", bevor die App bereitgestellt wird, und sie wird geladenproduction.properties.

Jetzt zum Testen der App atest.properties Datei sollte verwendet werden.

Wenn ich alle Tests durchführe, sagen unsere Jenkins Builds, und fügen sie hinzu-Denv=test wird wie erwartet funktionieren. Aber was ist, wenn ich in Eclipse nur einen einzigen Test mit dem integrierten JUnit-Runner ausführen möchte?

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = WebContextLoader.class, locations = {"classpath:application-context.xml" })
public class SomeTest {

Gibt es eine Möglichkeit, meinem Test mitzuteilen, dass die Systemeigenschaft "env" auf "test" gesetzt werden soll, BEVOR die Feder geladen wird? Weil mitMethodInvokingFactoryBean wird erst aus irgendeinem Grund nachträglich gesetzt, auch wenn ich es vor dem Laden meiner Eigenschaftendateien gesetzt habe:

<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>

Mit den in application.properties, production.properties und test.properties definierten Datenbankeigenschaften.

Der Punkt ist natürlich, dass ich für alle Umgebungen die gleiche Kontextdatei verwenden möchte, ansonsten könnte ich meinem Test einfach sagen, dass er einen anderen Kontext verwenden soll, in dem ich die PropertyPlaceholder-Eigenschaft "location" auf test.properties setze ... Aber ich möchte Meine Tests decken auch meinen Kontext ab, damit alle Fehler dort so früh wie möglich abgefangen werden. (Ich mache End-to-End-Tests auf unserer Web-App mit spring-web-mvc, die die gesamte Web-App lädt und dort ein nettes Feedback gibt Ich will das nicht verlieren.

Bisher kann ich nur sehen, dass der JUnit-Runner so konfiguriert wird, dass er ein Argument zum Festlegen von Systemeigenschaften enthält, obwohl ich nicht weiß, wie das geht.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage