2010-11-18 9 views
6

Durante l'esecuzione di un test junit, non riesco a ottenere il contesto dell'applicazione per caricare le proprietà dai file delle proprietà esterne.junit/proprietà molla non caricate con contesto applicazione

Dato il seguente:

TestClass

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:spring/app-config.xml") 
public class JdbcWatsonDaoTests { 

    @Autowired 
    JdbMyDao jdbcMyDao; 

    @Before 
    public void setUp() throws Exception { 
    } 

    @Test 
    public void testMethod() { 
     doSomeStuff(); 
    } 
} 

app-config.xml

<util:properties id="aProperties" location="classpath:spring/a.properties" /> 
<util:properties id="bProperties" location="classpath:spring/b.properties" /> 

<bean id="oracleDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/> 
    <property name="url" value="${oracle.url}"/> 
    <property name="username" value="${oracle.username}"/> 
    <property name="password" value="${oracle.password}"/> 
</bean> 

ei file a.properties e b.properties sono nella stessa posizione come App-Il config.xml ...

ho scoperto che quando si esegue il test, le proprietà di segnaposto s (letterale "$ {property}") è ciò che viene inviato al server Oracle invece dei valori nei file delle proprietà.

Ho anche provato ad utilizzare una configurazione bean utilizzando PropertyPlaceholderConfigurer invece di, ma ancora non trova/include proprietà.

Sto usando Helios eclissi, primavera 3.0.5, ultimo m2eclipse rilascio e 4.4 JUnit. Ho dovuto eseguire il downgrade di junit per un altro bug di maven/junit.

Quando pubblicate entro Tomcat, le proprietà vengono letti e utilizzati correttamente. Vedo solo il problema durante l'esecuzione di un test di junit.

+0

sono in esecuzione i test attraverso un accumulo Maven o traverso Eclipse> Esegui come> test JUnit? –

+0

eclipse> esegui come> junit test Maven a questo punto sta solo gestendo le dipendenze. L'ho portato solo perché ho riscontrato un altro bug che aveva a che fare con l'ordine del percorso di costruzione. – camada

risposta

0

Sembra che tu stia usando Maven. Sarebbe utile sapere dove hai messo i file. Per convenzione, la versione di test dei file delle proprietà dovrebbe andare in src/test/resources/e versione di produzione in src/main/resources. Dovrebbero risolversi automaticamente.

+0

src/main/risorse/primavera/ app-config.xml a.properties b.properties non ho avuto li copiati src/test/risorse. Ho appena copiato, pulito e rieseguito il test e ancora non funziona. L'eccezione effettiva generata è: org.springframework.jdbc.CannotGetJdbcConnectionException: impossibile ottenere la connessione JDBC; l'eccezione nidificata è org.apache.commons.dbcp.SQLNestedException: impossibile creare PoolableConnectionFactory (ORA-01017: nome utente/password non validi; accesso negato Se codice i valori nel file xml, funziona, ma non viene letto i file prop. – camada

5

Secondo il vostro eccezione:

org.springframework.jdbc.CannotGetJdbcConnectionException: Impossibile ottenere JDBC Connection; nidificato eccezione è org.apache.commons.dbcp.SQLNestedException: Impossibile creare PoolableConnectionFactory (ORA-01017: valida username/password, accesso negato di

tuo problema soltanto non è che le proprietà sono non trovato , se le proprietà non si trovano l'eccezione sarebbe qualcosa di simile org.springframework.beans.factory.BeanDefinitionStoreException: ... Could not resolve placeholder 'oracle.username'

E questo perché è necessario configurare un PropertyPlaceholderConfigurer invece di un PropertiesFactoryBean (questo è ciò che util: proprietà fa http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#xsd-config-body-schemas-util-properties)

<bean id="propertyPlaceHolderConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>classpath:spring/a.properties</value> 
       <value>classpath:spring/a.properties</value> 
      </list> 
     </property> 
    </bean> 
+0

Ma quando sostituisco il testo segnaposto nel contesto dell'applicazione con i valori effettivi di url/nome utente/password, il test viene eseguito. L'unica cosa che posso pensare è che le proprietà non sono state lette o trovate correttamente. [info] registra anche che le proprietà sono caricate.Quando questo è pubblicato in un contenitore Web, tutto funziona perfettamente, cioè le proprietà vengono trovate, lette e inserite correttamente. :( – camada

0

ho rinunciato. Ho scaricato una nuova copia di Eclipse 3.6 per Java EE e ho seguito le istallazioni di installazione della suite di strumenti di Springource tramite il metodo del sito di aggiornamento.

ho importato il mio progetto per il nuovo ambiente con un nuovo spazio di lavoro e everythign funziona bene.

sarò gesso fino ad eclissare gnomi.

1

È possibile separare i file di configurazione di test, spring contest, jbdc.proprietà, in src/test/resources dir per rispettare i file di struttura maven. Per configurare speciali proprietà file per il test è necessario definire nel loro contesto di applicazione di test di primavera utilizzando PropertyPlaceholderConfigurer come Ralph detto. file

proprietà deve essere in src/test/risorse e caricarli con la barra e il nome file /a.properties. Inserisci il file nella stessa directory del file di configurazione di primavera per caricarlo.

<bean id="propertyPlaceHolderConfigurer" 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>/a.properties</value> 
      <value>/a.properties</value> 
     </list> 
    </property> 
</bean> 
Problemi correlati