Diferencia entre revisiones de «Spring Test»
(→La clase AbstractDependencyInjectionSpringContextTests) |
(→Ver también) |
||
| Línea 98: | Línea 98: | ||
===Ver también=== | ===Ver también=== | ||
* [[Prueba Unitaria]] | * [[Prueba Unitaria]] | ||
| − | * [[ | + | * [[Easy Mock]] |
* [[Mock Ejb]] | * [[Mock Ejb]] | ||
===Mas información=== | ===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 14:35 25 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.
Contenido
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);
}
}
Cosas interesantes
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.