Diferencia entre revisiones de «Spring Test»
(→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: | |
* 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 | + | * 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 | + | 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''=== |
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> | ||
− | = | + | ===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]] | ||
− | |||
− | |||
* [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.
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); } }
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.