2010-11-18 17 views
6

Al ejecutar una prueba junit, no puedo obtener el contexto de la aplicación para cargar las propiedades de los archivos de propiedades externas.Propiedades junit/spring no cargadas con el contexto de la aplicación

Teniendo en cuenta lo siguiente:

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> 

y los archivos a.properties y b.properties se encuentran en la misma ubicación que app- config.xml ...

He encontrado que al ejecutar la prueba, las propiedades marcador de posición s (el literal "$ {propiedad}") es lo que se envía al servidor de Oracle en lugar de los valores en los archivos de propiedades.

También intenté usar una configuración de beans usando PropertyPlaceholderConfigurer en lugar de, pero todavía no encuentra/incluye propiedades.

Estoy usando eclipse helios, primavera 3.0.5, lanzamiento más reciente m2eclipse y 4.4 junit. Tuve que degradar junit por otro error maven/junit.

Cuando se publica en tomcat, las propiedades se leen y utilizan correctamente. Solo veo el problema cuando ejecuto una prueba junit.

+0

¿Estás ejecutando las pruebas a través de una compilación maven o thorugh eclipse> run as> junit test? –

+0

eclipse> ejecutar como> junit test maven en este punto solo está gestionando dependencias. Solo lo mencioné porque me encontré con otro error que tenía que ver con el orden de compilación. – camada

Respuesta

0

Parece que estás usando maven. Ayudaría saber dónde coloca los archivos. Por convención, la versión de prueba de los archivos de propiedades debe ir en src/test/resources/y la versión de producción en src/main/resources. Deben resolverse automáticamente.

+0

src/main/resources/primavera/ app-config.xml a.properties b.properties yo no tenía copiarlos a src/test/recursos. Acabo de copiarlos, limpiarlos y volver a ejecutar la prueba y todavía no funciona. La excepción real lanzada es: org.springframework.jdbc.CannotGetJdbcConnectionException: No se pudo obtener la conexión JDBC; La excepción anidada es org.apache.commons.dbcp.SQLNestedException: No se puede crear PoolableConnectionFactory (ORA-01017: nombre de usuario/contraseña no válidos; inicio de sesión denegado Si codigo los valores en el archivo xml, funciona, pero aún no se leerá los archivos prop. – camada

5

Según su excepción:

org.springframework.jdbc.CannotGetJdbcConnectionException: No se pudo obtener conexiones JDBC; anidada excepción es org.apache.commons.dbcp.SQLNestedException: No se puede crear PoolableConnectionFactory (ORA-01017: no válido nombre de usuario/contraseña, abrir una sesión negaron

No son que las propiedades no se encuentran Su probelm , si las propiedades no se encuentran la excepción sería algo así como org.springframework.beans.factory.BeanDefinitionStoreException: ... Could not resolve placeholder 'oracle.username'

Y esto se debe a necesita configurar un PropertyPlaceholderConfigurer en lugar de un PropertiesFactoryBean (esto es lo util: ¿Tiene propiedades 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

Pero cuando reemplazo el texto del marcador de posición en el contexto de la aplicación con los valores reales de url/nombre de usuario/contraseña, la prueba se ejecuta. Lo único que se me ocurre es que las propiedades no se leen ni se encuentran correctamente. Los registros [info] incluso indican que las propiedades están cargadas. Cuando se publica en un contenedor web, todo funciona bien, es decir, las propiedades se encuentran, se leen y se insertan correctamente. – camada

0

me di por vencido. Descargué una nueva copia de Eclipse 3.6 para Java EE y seguí las instrucciones de instalación de la suite de herramientas springsource a través del método del sitio de actualización.

Importé mi proyecto al nuevo entorno con un nuevo espacio de trabajo y todo funciona bien.

Lo califico para eclipsar gnomos.

1

Puede separar sus archivos de configuración de prueba, contexto de primavera, jbdc.propiedades, en src/test/resources dir para respetar archivos de estructura maven. Para configurar archivos propiedades especiales archivos de prueba, tiene que definirlos en el contexto de la aplicación primavera de prueba utilizando propertyPlaceHolderConfigurer como Ralph dicho. archivos

propiedades deben estar en src/test/recursos y cargarlos con la barra y el nombre /a.properties. Coloque el archivo en el mismo directorio que el archivo de configuración de primavera para cargarlo.

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