web-dev-qa-db-de.com

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

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

Die Standardeinstellung für die lokale Ausführung ist in application.properties gespeichert. Auf dem Produktionsserver haben wir gerade "env" vor der Bereitstellung der App auf "production" gesetzt, und es wird production.properties geladen.

Zum Testen der App sollte nun eine test.properties-Datei verwendet werden.

Wenn ich alle Tests in unserem Jenkins-Build durchführe, funktioniert das Hinzufügen von -Denv=test wie erwartet. Was aber, wenn ich nur einen einzigen Test in Eclipse mit dem integrierten JUnit-Läufer durchfü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 er die Systemeigenschaft "env" auf "test" setzen soll, bevor Spring geladen wird? Weil die Verwendung von MethodInvokingFactoryBean es aus irgendeinem Grund erst nachträglich setzt, selbst wenn ich es vor dem Laden meiner Eigenschaftendateien festlege:

<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 Datenbankeigenschaften, die in application.properties, production.properties und test.properties definiert sind.

Der Punkt ist natürlich, dass ich dieselbe Kontextdatei für alle Umgebungen verwenden möchte. Andernfalls könnte ich meinem Test sagen, dass er einen anderen Kontext verwenden soll, in dem ich die PropertyPlaceholder-Eigenschaft "location" auf test.properties gesetzt habe. Aber ich möchte Meine Tests sollen auch meinen Kontext abdecken, so dass eventuelle Fehler so früh wie möglich aufgefangen werden (Ich mache End-to-End-Tests in unserer Web-App mit spring-web-mvc, wodurch die gesamte Web-App geladen wird Ich will das nicht verlieren).

Die einzige Möglichkeit, die ich sehen kann, besteht bisher darin, den JUnit-Runner so zu konfigurieren, dass er einige Argumente für die Einstellung der Systemeigenschaften enthält, obwohl ich nicht weiß, wie das geht.

19
Pete

Ich arbeite gerade an demselben Problem und habe hoffentlich den Weg gefunden. Sie können System.setProperty() im statischen Initialisierer Ihres Testfalls aufrufen.

39
AlexR

Klicken Sie in Eclipse mit der rechten Maustaste auf die JUnit-Testklasse, wählen Sie "Ausführen als"> "Konfigurationen ausführen ...". Klicken Sie dann auf die Registerkarte "Argumente" und fügen Sie unter VM Argumente den Eintrag der Systemeigenschaften hinzu, z. -Dcatalina.base = C:\programme\Apache-Tomcat-7.0.32

19
bratan

Sie können versuchen, das Attribut depends-on zu verwenden, um die Methode aufzurufen, die das Bean vor anderen startet 

0
bmichalik