web-dev-qa-db-fra.com

Définir une propriété système pour JUnit Runner (Eclipse) afin de tester une application Web Spring

Notre application Web utilise SystemPropertyPlaceholder pour charger des fichiers de propriétés en fonction de la valeur d'une propriété système (voir ci-dessous).

La configuration par défaut pour l’exécuter localement est stockée dans application.properties. Sur le serveur de production, nous venons de définir "env" sur "production" avant de déployer l'application, qui chargera production.properties.

Maintenant, pour tester l'application, un fichier test.properties doit être utilisé.

Si je lance tous les tests disent dans notre version de jenkins, l'ajout de -Denv=test fonctionnera comme prévu. Mais que se passe-t-il si je veux juste exécuter un seul test dans Eclipse avec le programme intégré JUnit?

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

Est-il possible d'indiquer à mon test qu'il doit définir la propriété système "env" sur "test" AVANT que Spring soit chargé? Parce que l'utilisation de MethodInvokingFactoryBean ne le définira que plus tard pour une raison quelconque, même si je le définis avant de charger mes fichiers de propriétés:

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

Avec les propriétés de base de données définies dans application.properties, production.properties et test.properties.

Le but est bien sûr que je veuille utiliser le même fichier de contexte pour tous les environnements, sinon je pourrais simplement dire à mon test d’utiliser un contexte différent dans lequel je règle la propriété "location" de PropertyPlaceholder sur test.properties ... Mais je veux mes tests couvrent également mon contexte pour que les erreurs éventuelles soient détectées le plus tôt possible (je fais des tests de bout en bout sur notre application Web avec spring-web-mvc, qui charge l'ensemble de l'application Web et fournit des commentaires de Nice là-bas et Je ne veux pas perdre ça).

Jusqu'ici, le seul moyen que je vois serait de configurer le coureur JUnit pour inclure un argument de paramétrage de propriété système, bien que je ne sache pas comment faire cela.

19
Pete

Je travaille sur exactement le même problème maintenant et j'espère trouvé le chemin. Vous pouvez appeler System.setProperty() dans l'initialiseur statique de votre scénario de test.

39
AlexR

Dans Eclipse, cliquez avec le bouton droit sur la classe de test JUnit, sélectionnez Exécuter en tant que> Exécuter les configurations ..., puis accédez à l'onglet Arguments. Sous VM Arguments, ajoutez l'entrée de propriété système, par exemple. -Dcatalina.base = C:\programmes\Apache-Tomcat-7.0.32

19
bratan

Vous pouvez essayer d’utiliser depends-on attribut pour que la méthode d’appel du bean s’exécute 

0
bmichalik