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 ..
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' –