2012-06-12 11 views
16

nostro web app utilizza SystemPropertyPlaceholder per caricare i file di proprietà a seconda del valore di una proprietà di sistema (vedi sotto)Set Proprietà di sistema per JUnit Runner (Eclipse) per testare una molla Web App

L'impostazione di default per l'esecuzione in locale è memorizzato in application.properties. Sul server di produzione attualmente impostiamo "env" su "production" prima di distribuire l'app e verrà caricato production.properties.

Ora per testare l'app deve essere utilizzato un file test.properties.

Se eseguo tutti i test, nella build di jenkins, l'aggiunta di -Denv=test funzionerà come previsto. Ma cosa succede se voglio solo eseguire un singolo test in Eclipse con il JUnit runner integrato?

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

Esiste un modo per dire la mia prova si deve impostare la proprietà di sistema "env" per "testare" prima della primavera viene caricato? Perché l'utilizzo MethodInvokingFactoryBean imposterà solo in seguito per qualche ragione, anche se ho impostato prima di caricare i file di proprietà:

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

Con le proprietà del database definite all'interno application.properties, production.properties e test.properties.

Il punto è, ovviamente, che voglio utilizzare lo stesso file di contesto per tutti gli ambienti, altrimenti potrei semplicemente dire al mio test di usare un contesto diverso dove ho impostato la proprietà "location" di PropertyPlaceholder su test.properties .. Ma voglio che i miei test coprano anche il mio contesto in modo che tutti gli errori vengano intercettati il ​​prima possibile (eseguo test end-to-end sulla nostra app Web con spring-web-mvc che carica l'intera app Web fornendo alcuni bel feedback lì e non voglio perdere questo).

Finora l'unico modo in cui posso vedere potrebbe essere quella di configurare il corridore JUnit per includere alcune proprietà di sistema impostazione argomento, anche se non so come fare ..

+0

direi profili d'uso in quei profili importare il corretto file necessari Sembra che tu stia reinventando la ruota. Con il profilo puoi semplicemente aggiungere '@ ActiveProfiles' al tuo caso di test per avere le cose giuste caricate. Invece di '-Denv = test' userai' -Dspring.active.profiles = test' –

risposta

33

sto lavorando esattamente lo stesso problema ora e, si spera, trovato la strada. Puoi chiamare System.setProperty() nell'inizializzatore statico del tuo caso di test.

+0

Cool, funziona! Grazie! :) – Pete

+1

Mentre funziona quando si esegue un test individuale, potrebbe non funzionare necessariamente quando si eseguono più test, poiché il contesto Spring può essere riutilizzato su più test. – pimlottc

+0

@pimlottc, IMHO che esegue test multipli non causa alcun problema in questo caso. Il problema è che dobbiamo impostare la proprietà di sistema prima dell'inizializzazione del contesto di primavera. Ciò si ottiene utilizzando l'inizializzatore statico. Se tutti i casi di test che condividono lo stesso contesto di primavera impostano questa proprietà (che è il caso), il contesto di primavera verrà inizializzato correttamente. – AlexR

16

In Eclipse, fare clic con il pulsante destro del mouse sulla classe di test JUnit, selezionare Esegui come> Esegui configurazioni ..., quindi accedere alla scheda Argomenti e, sotto Argomenti VM, aggiungere la voce della proprietà di sistema, ad es. -Dcatalina.base = C: \ programmi \ apache-tomcat-7.0.32

+3

C'è un modo per fare questo per tutti i test di default, quindi non è necessario impostare manualmente questa proprietà per ogni test? – Stewart

0

Si potrebbe provare a utilizzare l'attributo depends-on avere metodo invocare run di fagioli prima di altri

Problemi correlati