Diferencia entre revisiones de «Spring Test»

De Dos Ideas.
Saltar a: navegación, buscar
(Ver también)
Línea 1: Línea 1:
 
[[Spring Framework]] contiene un conjunto de clases pensadas para realizar [[Prueba Unitaria]] y [[Prueba De Integracion]], facilitando varias tareas repetitivas. En particular, estas utilidades se integran directamente con [[JUnit]].
 
[[Spring Framework]] contiene un conjunto de clases pensadas para realizar [[Prueba Unitaria]] y [[Prueba De Integracion]], facilitando varias tareas repetitivas. En particular, estas utilidades se integran directamente con [[JUnit]].
  
[[Spring Test]] provee:
+
Spring Test provee:
 
* integración con [[JUnit]]
 
* integración con [[JUnit]]
 
* acceso al factory de beans directamente desde los test unitarios
 
* acceso al factory de beans directamente desde los test unitarios
* inyección automática de la clase bajo test en el [[TestCase]]
+
* inyección automática de la clase bajo test en el TestCase
 
* rollback automático de transacciones contra bases de datos
 
* rollback automático de transacciones contra bases de datos
 
* acceso a la conexión jdbc para realizar querys de comprobación
 
* acceso a la conexión jdbc para realizar querys de comprobación
Línea 10: Línea 10:
  
  
El uso general de [[Spring Test]] implica escribir casos de prueba de [[[JUnit]] que hereden de clases abstractas de [[Spring Test]].
+
El uso general de [[Spring Test]] implica escribir casos de prueba de [[[JUnit]] que hereden de clases abstractas de Spring Test.
  
  
===Ejemplo===
+
==Ejemplo==
  
==La clase  ''AbstractDependencyInjectionSpringContextTests''==
+
===La clase  ''AbstractDependencyInjectionSpringContextTests''===
 
La clase AbstractDependencyInjectionSpringContextTests provee a los tests que heredan acceso al factory de spring. Esta es la clase más práctica para usar con Spring, a menos que se quiera manejo de transacciones (ver a continuación).
 
La clase AbstractDependencyInjectionSpringContextTests provee a los tests que heredan acceso al factory de spring. Esta es la clase más práctica para usar con Spring, a menos que se quiera manejo de transacciones (ver a continuación).
  
 
Al heredar de esta clase se debe sobreescribir el método ''getConfigLocations()'', el cual devuelve los XML de Spring a cargar. Luego, en los tests, es posible utilizar el objeto ''applicationContext'' que viene heredado, y del cual podremos obtener los objetos.
 
Al heredar de esta clase se debe sobreescribir el método ''getConfigLocations()'', el cual devuelve los XML de Spring a cargar. Luego, en los tests, es posible utilizar el objeto ''applicationContext'' que viene heredado, y del cual podremos obtener los objetos.
  
 +
<pre>
 
  public class InvasorBoTest extends AbstractDependencyInjectionSpringContextTests {
 
  public class InvasorBoTest extends AbstractDependencyInjectionSpringContextTests {
  
Línea 45: Línea 46:
 
     }
 
     }
 
  }
 
  }
 +
</pre>
  
==La clase AbstractTransactionalDataSourceSpringContextTests==
+
===La clase AbstractTransactionalDataSourceSpringContextTests===
 
La clase AbstractTransactionalDataSourceSpringContextTests provee a los tests que hereden acceso al factory de spring, y rollback automático de las transacciones.
 
La clase AbstractTransactionalDataSourceSpringContextTests provee a los tests que hereden acceso al factory de spring, y rollback automático de las transacciones.
  
Esta clase es muy útil para testear [DAO] o cualquier otro objeto que modifique datos en una [[Base De Datos]].
+
Esta clase es muy útil para testear [[DAO]] o cualquier otro objeto que modifique datos en una [[Base De Datos]].
 
 
  
 +
<pre>
 
  public class InvasorDaoTest extends AbstractTransactionalDataSourceSpringContextTests {
 
  public class InvasorDaoTest extends AbstractTransactionalDataSourceSpringContextTests {
 
   
 
   
Línea 82: Línea 84:
 
     }
 
     }
 
  }
 
  }
 +
</pre>
  
=Cosas interesantes=
+
===Explicación===
  
 
El método ''getConfigLocations()'' devuelve la lista de archivos de configuración. Obviamente, lo recomendable es crear una superclase que sobreescriba dicho método, y todos los tests heredarlos de dicha clase.
 
El método ''getConfigLocations()'' devuelve la lista de archivos de configuración. Obviamente, lo recomendable es crear una superclase que sobreescriba dicho método, y todos los tests heredarlos de dicha clase.
Línea 95: Línea 98:
 
* [[Easy Mock]]
 
* [[Easy Mock]]
 
* [[MockEjb]]
 
* [[MockEjb]]
 
===Mas información===
 
 
* [http://static.springframework.org/spring/docs/2.5.x/reference/testing.html Documentacion de  SpringTest]
 
* [http://static.springframework.org/spring/docs/2.5.x/reference/testing.html Documentacion de  SpringTest]

Revisión del 13:22 27 jul 2008

Spring Framework contiene un conjunto de clases pensadas para realizar Prueba Unitaria y Prueba De Integracion, facilitando varias tareas repetitivas. En particular, estas utilidades se integran directamente con JUnit.

Spring Test provee:

  • integración con JUnit
  • acceso al factory de beans directamente desde los test unitarios
  • inyección automática de la clase bajo test en el TestCase
  • rollback automático de transacciones contra bases de datos
  • acceso a la conexión jdbc para realizar querys de comprobación
  • y varias utilidades más.


El uso general de Spring Test implica escribir casos de prueba de [[[JUnit]] que hereden de clases abstractas de Spring Test.


Ejemplo

La clase AbstractDependencyInjectionSpringContextTests

La clase AbstractDependencyInjectionSpringContextTests provee a los tests que heredan acceso al factory de spring. Esta es la clase más práctica para usar con Spring, a menos que se quiera manejo de transacciones (ver a continuación).

Al heredar de esta clase se debe sobreescribir el método getConfigLocations(), el cual devuelve los XML de Spring a cargar. Luego, en los tests, es posible utilizar el objeto applicationContext que viene heredado, y del cual podremos obtener los objetos.

 public class InvasorBoTest extends AbstractDependencyInjectionSpringContextTests {

     private InvasorBo invasorBo;

     @Override
     protected String[] getConfigLocations() {
         return new String[] { "classpath:application-db.xml",
                               "classpath:application-bo.xml"};
     }

     @Override
     public void onSetUp() {
         invasorBo = (InvasorBo) applicationContext.getBean("business.InvasorBo");
     }

     /** Busca un invasor por su identificador unico */
     public void testBuscar() {
         System.out.println("testBuscar");
         String idInvasor = 100;
 
         Invasor invasor = invasorBo.buscar(idInvasor);
         assertNotNull(invasor);
         assertEquals(idInvasor, invasor.getId());
     }
 }

La clase AbstractTransactionalDataSourceSpringContextTests

La clase AbstractTransactionalDataSourceSpringContextTests provee a los tests que hereden acceso al factory de spring, y rollback automático de las transacciones.

Esta clase es muy útil para testear DAO o cualquier otro objeto que modifique datos en una Base De Datos.

 public class InvasorDaoTest extends AbstractTransactionalDataSourceSpringContextTests {
 
     private InvasorDao invasorDao;
 
     @Override
     protected String[] getConfigLocations() {
         return new String[] { "classpath:application-db.xml",
                               "classpath:application-hibernate.xml",
                               "classpath:application-dao.xml"};
     }
 
     @Override
     public void onSetUp() {
         invasorDao = (InvasorDao) applicationContext.getBean("dao.InvasorDao");
     }
 
     /** Inserta una fila en una tabla */
     public void testGuardar() {
         System.out.println("testGuardar");
         int cantOriginal = countRowsInTable("INVASORES");
         Invasor invasor = new Invasor();
         invasor.setNombre("Zim");
         invasor.setOrden("Invadir la Tierra");
 
         invasorDao.guardar(invasor);
 
         int cantInsert = countRowsInTable("INVASORES");
         assertEquals(cantOriginal + 1, cantInsert);
     }
 }

Explicación

El método getConfigLocations() devuelve la lista de archivos de configuración. Obviamente, lo recomendable es crear una superclase que sobreescriba dicho método, y todos los tests heredarlos de dicha clase.

El método countRowsInTable() es uno de los métodos heredados utilitarios que tiene la aplicación (cuenta la cantidad de filas de una tabla). A su vez, a través del atributo jdbcTemplate (también heredado) es posible realizar consultas en la misma transacción.

Más aún, es posible forzar el commit de la transacción si así se deseara.

Ver también