xml - tests - spring mvc test
¿Cómo crear TestContext para Spring Test? (2)
Para encontrarlo directamente en src / test / resources, cámbielo a:
@ContextConfiguration({"classpath:/test-applicationContext.xml"})
Cuando no especifica nada, entonces Spring busca en el mismo paquete que la clase de prueba.
Tengo una biblioteca Java relativamente pequeña que implementa unas pocas docenas de beans (sin base de datos o GUI). He creado un archivo de configuración de Spring Bean que otros proyectos de Java usan para inyectar mis beans en sus cosas.
Ahora estoy por primera vez tratando de usar Spring Test para inyectar algunos de estos beans en mis clases de prueba junit (en lugar de simplemente crear instancias de ellos).
Estoy haciendo esto en parte para aprender Spring Test y en parte para forzar las pruebas para usar el mismo archivo de configuración de frijol que proporciono para otros.
En la documentación de Spring se dice que necesito crear un contexto de aplicación usando la clase "TestContext" que viene con Spring. Creo que esto debería hacerse en un archivo XML de primavera que hago referencia a través de la anotación @ContextConfiguration en mi clase de prueba.
@ContextConfiguration({"/test-applicationContext.xml"})
Sin embargo, ¡no hay ninguna pista sobre qué poner en el archivo!
Cuando voy a ejecutar mis pruebas desde Eclipse, se equivoca al decir "no se pudo cargar el contexto de la aplicación" ... por supuesto.
Actualizar:
Aquí está test-applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<description>Holds application context for testing of the domain module.</description>
<!-- Imports the uuid generator bean definitions -->
<import resource="resources/domain-uuid.xml"/>
</beans>
Mi directorio de proyectos es así:
domain/
src/
main/
java/
resources/
test/
java/
resources/ (location of test-applicationContext.xml)
Solo por diversión, también intenté construir desde la línea de comandos de mvn a través de "mvn clean test" y obtuve los siguientes errores, que pueden ser mi problema real:
package org.springframework.test.context does not exist
package org.springframework.test.context.junit4 does not exist
cannot find symbol
symbol: class ContextConfiguration
@ContextConfiguration({"/resources/test-applicationContext.xml"})
cannot find symbol
symbol: class SpringJUnit4ClassRunner
@RunWith(SpringJUnit4ClassRunner.class)
Qué poner en el archivo de contexto de la aplicación. La forma en que funciona TestContext Framework es que le permite reutilizar el cableado de la aplicación en el contexto de sus pruebas de integración. Por lo tanto, en su mayor parte , no hay nada especial para las pruebas que pondría dentro de los archivos de configuración de contexto de su aplicación. Si su controlador tiene una dependencia de beans de servicio en su aplicación, también lo tendrá en su prueba de integración. Si su DAO tiene una SessionFactory en su aplicación, entonces lo mismo para su prueba de integración. De esta forma, no tendrá que volver a cablear todo eso cuando escriba pruebas de integración. Muy genial.
Dije en su mayor parte arriba porque hay al menos una excepción que viene a la mente. Normalmente, su aplicación utilizará JNDI para ubicar un DataSource, pero en una prueba de integración (al menos una prueba de integración fuera del contenedor), normalmente no tendrá un entorno JNDI disponible. Por lo tanto, normalmente debe aislar la creación del bean DataSource en un archivo separado y usar una versión JNDI para su aplicación en vivo y una versión que no sea JNDI (por ejemplo, simplemente cree un BasicDataSource
directo, por ejemplo) para su prueba de integración. Aquí hay un ejemplo de lo primero:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myStoreDS" resource-ref="true"/>
y aquí hay un ejemplo de este último:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${dataSource.driverClassName}"
p:url="${dataSource.url}"
p:username="${dataSource.username}"
p:password="${dataSource.password}" />
Estos irían en archivos separados. El primero podría ir en beans-datasource.xml
para el uso normal de la aplicación y el segundo en beans-datasource-it.xml
para las pruebas de integración. La configuración que es común para el uso normal de la aplicación y las pruebas de integración (es decir, la gran mayoría de sus configuraciones de bean en la mayoría de los casos) debe estar en un archivo de configuración o archivos comunes.
Además, Spring 3 introduce un nuevo espacio de nombres jdbc
que le permite crear una base de datos incrustada, como una base de datos HSQLDB o una base de datos Derby, etc. Se ve así:
<jdbc:embedded-database id="dataSource">
<jdbc:script location="classpath:hsql/schema.sql" />
<jdbc:script location="classpath:hsql/test-data.sql" />
</jdbc:embedded-database>
Eso reemplazaría la configuración de BasicDataSource
descrita anteriormente, si desea usar esto.
Por qué está ocurriendo el error El error que está viendo está sucediendo porque su valor @ContextConfiguration
está implícitamente indicando que el archivo de contexto de la aplicación debe estar en el classpath. IMPORTANTE: elimine la pieza /resources
. Eso es Maven innards; cuando construye su JAR o WAR, copia los contenidos del directorio de resources
en su classpath, no los resources
sí. Eso debería ayudar.
EDITAR:
Para abordar los errores "sin símbolos encontrados", deberá agregar sus dependencias de prueba a su Maven POM. Este será también el JUnit y el módulo de Spring Test, ambos con <scope>test</scope>
. Además, si está utilizando un marco simulado como Mockito, deberá agregar esa dependencia (con ámbito de prueba) a su POM también. Pruébalo y por favor informa sobre lo que sucede.