Diferencia entre revisiones de «Spring Test»

De Dos Ideas.
Saltar a: navegación, buscar
(Ejemplo)
(Ver también)
 
(No se muestran 22 ediciones intermedias de 6 usuarios)
Línea 1: Línea 1:
 +
[[Category:Spring Framework]]
 +
[[Category: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 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
 
* y varias utilidades más.
 
* 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.
  
El uso general de [[Spring Test]] implica escribir casos de prueba de [[[JUnit]] que hereden de clases abstractas de [[Spring Test]].
+
==JUnit 3.x==
  
 +
'''El soporte para JUnit 3.x está obsoleto a partir de Spring Framework 3.0'''.
  
===Ejemplo===
+
====La clase AbstractDependencyInjectionSpringContextTests====
 
 
==La clase==
 
 
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.
  
 +
<code java>
 
  public class InvasorBoTest extends AbstractDependencyInjectionSpringContextTests {
 
  public class InvasorBoTest extends AbstractDependencyInjectionSpringContextTests {
  
Línea 39: Línea 42:
 
         System.out.println("testBuscar");
 
         System.out.println("testBuscar");
 
         String idInvasor = 100;
 
         String idInvasor = 100;
 
+
 
         Invasor invasor = invasorBo.buscar(idInvasor);
 
         Invasor invasor = invasorBo.buscar(idInvasor);
 
         assertNotNull(invasor);
 
         assertNotNull(invasor);
Línea 45: Línea 48:
 
     }
 
     }
 
  }
 
  }
 +
</code>
  
 
+
====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]].
 
 
  
 +
<code java>
 
  public class InvasorDaoTest extends AbstractTransactionalDataSourceSpringContextTests {
 
  public class InvasorDaoTest extends AbstractTransactionalDataSourceSpringContextTests {
 
+
 
     private InvasorDao invasorDao;
 
     private InvasorDao invasorDao;
 
+
 
     @Override
 
     @Override
 
     protected String[] getConfigLocations() {
 
     protected String[] getConfigLocations() {
Línea 67: Línea 66:
 
                               "classpath:application-dao.xml"};
 
                               "classpath:application-dao.xml"};
 
     }
 
     }
 
+
 
     @Override
 
     @Override
 
     public void onSetUp() {
 
     public void onSetUp() {
 
         invasorDao = (InvasorDao) applicationContext.getBean("dao.InvasorDao");
 
         invasorDao = (InvasorDao) applicationContext.getBean("dao.InvasorDao");
 
     }
 
     }
 
+
 
     /** Inserta una fila en una tabla */
 
     /** Inserta una fila en una tabla */
 
     public void testGuardar() {
 
     public void testGuardar() {
Línea 80: Línea 79:
 
         invasor.setNombre("Zim");
 
         invasor.setNombre("Zim");
 
         invasor.setOrden("Invadir la Tierra");
 
         invasor.setOrden("Invadir la Tierra");
 
+
 
         invasorDao.guardar(invasor);
 
         invasorDao.guardar(invasor);
 
+
 
         int cantInsert = countRowsInTable("INVASORES");
 
         int cantInsert = countRowsInTable("INVASORES");
 
         assertEquals(cantOriginal + 1, cantInsert);
 
         assertEquals(cantOriginal + 1, cantInsert);
 
     }
 
     }
 
  }
 
  }
 +
</code>
  
=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 96: Línea 96:
 
Más aún, es posible forzar el commit de la transacción si así se deseara.
 
Más aún, es posible forzar el commit de la transacción si así se deseara.
  
===Ver también===
+
==JUnit 4.x==
 +
Spring Framework 2.5.x funciona con JUnit 4.4; Spring Framework 3.0 ya trae soporte para JUnit 4.5 y superior.
 +
 
 +
Si se utiliza JUnit 4.x, la configuración para inyección es mucho más simple, haciendose a través de anotaciones:
 +
 
 +
<code java>
 +
@RunWith(SpringJUnit4ClassRunner.class)
 +
@ContextConfiguration(locations = {
 +
    "classpath:application-db.xml",
 +
    "classpath:application-bo.xml"
 +
})
 +
public class InvasorBoTest {
 +
 
 +
    /** La anotacion Autowired inyecta automáticamente el bean de acuerdo a su tipo */
 +
    @Autowired
 +
    private InvasorBo invasorBo;
 +
 
 +
    /** Busca un invasor por su identificador unico */
 +
    @Test
 +
    public void buscar() {
 +
        System.out.println("testBuscar");
 +
        String idInvasor = 100;
 +
 +
        Invasor invasor = invasorBo.buscar(idInvasor);
 +
        assertNotNull(invasor);
 +
        assertEquals(idInvasor, invasor.getId());
 +
    }
 +
}
 +
</code>
 +
 
 +
La anotación ''@RunWith(SpringJUnit4ClassRunner.class)'' hace que Spring levante su factory y prepare la ejecución. De forma alternativa se puede heredar de la clase ''AbstractJUnit4SpringContextTests''; de hacerlo, se tiene acceso al contexto de Spring y otras utilidades.
 +
 
 +
=== Transacciones ===
 +
Es posible manejar las transacciones en los tests, de manera de hacer un rollback automático de las operaciones realizadas. Para esto usamos la anotación ''@TransactionConfiguration'' y ''@Transactional''.
 +
 
 +
<code java>
 +
@RunWith(SpringJUnit4ClassRunner.class)
 +
@ContextConfiguration(locations = {
 +
    "classpath:application-db.xml",
 +
    "classpath:application-bo.xml"
 +
})
 +
@TransactionConfiguration(transactionManager="transactionManager")
 +
@Transactional
 +
public class InvasorBoTest {
 +
 
 +
    /** La anotacion Autowired inyecta automáticamente el bean de acuerdo a su tipo */
 +
    @Autowired
 +
    private InvasorBo invasorBo;
 +
 
 +
    /** Este test tendrá un rollback automático  */
 +
    @Test
 +
    public void buscar() {
 +
        ...
 +
    }
 +
}
 +
</code>
 +
 
 +
La anotación @TransactionConfiguration indica cuál es el transactionManager que utilizarán los tests y sobre el cual se hará un rollback. La anotación @Transactional hace transaccional a toda la clase de test.
 +
 
 +
==Ver también==
 
* [[Prueba Unitaria]]
 
* [[Prueba Unitaria]]
 
* [[EasyMock]]
 
* [[EasyMock]]
* [[Mock Ejb]]
+
* [[MockEjb]]
 +
* [[Springockito]]
 +
* [[Transacciones Con Spring]]
 +
* [http://static.springframework.org/spring/docs/2.5.x/reference/testing.html Documentacion de  SpringTest]
 +
* [http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/testing.html#testcontext-tx Transaction Management en tests]
  
===Mas información===
+
[[Category:TDD]]
* [http://static.springframework.org/spring/docs/2.5.x/reference/testing.html Documentacion de  SpringTest]
+
[[Category:Spring Framework]]
 +
[[Category:JUnit]]

Revisión actual del 18:09 5 mar 2013

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.

JUnit 3.x

El soporte para JUnit 3.x está obsoleto a partir de Spring Framework 3.0.

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.

JUnit 4.x

Spring Framework 2.5.x funciona con JUnit 4.4; Spring Framework 3.0 ya trae soporte para JUnit 4.5 y superior.

Si se utiliza JUnit 4.x, la configuración para inyección es mucho más simple, haciendose a través de anotaciones:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {

   "classpath:application-db.xml",
   "classpath:application-bo.xml"

}) public class InvasorBoTest {

    /** La anotacion Autowired inyecta automáticamente el bean de acuerdo a su tipo */
    @Autowired
    private InvasorBo invasorBo;
    /** Busca un invasor por su identificador unico */
    @Test
    public void buscar() {
        System.out.println("testBuscar");
        String idInvasor = 100;

        Invasor invasor = invasorBo.buscar(idInvasor);
        assertNotNull(invasor);
        assertEquals(idInvasor, invasor.getId());
    }

}

La anotación @RunWith(SpringJUnit4ClassRunner.class) hace que Spring levante su factory y prepare la ejecución. De forma alternativa se puede heredar de la clase AbstractJUnit4SpringContextTests; de hacerlo, se tiene acceso al contexto de Spring y otras utilidades.

Transacciones

Es posible manejar las transacciones en los tests, de manera de hacer un rollback automático de las operaciones realizadas. Para esto usamos la anotación @TransactionConfiguration y @Transactional.

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {

   "classpath:application-db.xml",
   "classpath:application-bo.xml"

}) @TransactionConfiguration(transactionManager="transactionManager") @Transactional public class InvasorBoTest {

    /** La anotacion Autowired inyecta automáticamente el bean de acuerdo a su tipo */
    @Autowired
    private InvasorBo invasorBo;
    /** Este test tendrá un rollback automático  */
    @Test
    public void buscar() {
        ...
    }

}

La anotación @TransactionConfiguration indica cuál es el transactionManager que utilizarán los tests y sobre el cual se hará un rollback. La anotación @Transactional hace transaccional a toda la clase de test.

Ver también