Spring proporciona un conjunto de anotaciones para poder realizar tests de integración con el objeto de poder probar una aplicación sin tener que desplegarla o establecer conexiones reales con algún otro sistema, como una base de datos por ejemplo.

@ContextConfiguration

Esta anotación permite especificar de donde obtener la configuración del contexto concreto a utilizar para una clase de pruebas.

Como atributo se puede indicar la ubicación de ficheros XML:

@ContextConfiguration(locations="classpath:testConfig.xml")
public class Tests {
...

O clases que tengan el atributo @Configuration:

@ContextConfiguration(classes=TestConfig.class)
public class Tests {
...

Las anotaciones en las clases son heredadas, por lo que se pueden construir jerarquías de clases para realizar configuraciones especializadas.

@ActiveProfiles

Esta anotación permite especificar qué perfil tienen que tener los beans a utilizar por una clase de pruebas:

@ActiveProfiles("dev")
public class Tests {
...

Los perfiles se definen utilizando la etiqueta profile en los ficheros de configuración XML, o la anotación @Profile directamente sobre las clases.

Supongamos por ejemplo el siguiente sencillo esquema de clases:

public interface Vehiculo {
}

public class Camion implements Vehiculo {
}

public class Camioneta implements Vehiculo {
}

En el fichero de configuración se podría indicar que la clase Camion se quiere utilizar en entornos de producción, y la clase Camioneta en entornos de desarrollo:

<beans profile="production">
  <bean id="vehiculo" class="com.empresa.Camion"/>
</beans>

<beans profile="dev">
  <bean id="vehiculo" class="com.empresa.Camioneta"/>
</beans>

El código equivalente manipulando directamente el contexto sería similar al siguiente:

context.getEnvironment().setActiveProfiles("dev");
context.refresh();

@DirtiesContext

Esta anotación sirve para indicar que el contexto utilizado por una clase de prueba se va a modificar o corromper teniendo que ser cerrado y descartado al terminar la prueba:

@DirtiesContext
public class Tests {
...

La anotación admite un parámetro que permite establecer cuando se tiene que descartar el contexto, por ejemplo cada vez que se ejecuta un método de la clase:

@DirtiesContext(classMode=ClassMode.AFTER_EACH_TEST_METHOD)
public class Tests{
...

Spring mantiene internamente una cache de contextos, para evitar tener que instanciarlos por cada prueba, por lo que esta anotación resulta de utilidad para eliminar contextos de la cache.

@TestExecutionListeners

Esta anotación permite configurar listeners para un contexto de pruebas:

@TestExecutionListeners(TestListener.class)
public class Tests{
...

Una clase que quiera actuar como listener tiene que implementar la interface TestExecutionListener:

public interface TestExecutionListener {

    void beforeTestClass(TestContext testContext) throws Exception;

    void prepareTestInstance(TestContext testContext) throws Exception;

    void beforeTestMethod(TestContext testContext) throws Exception;

    void afterTestMethod(TestContext testContext) throws Exception;

    void afterTestClass(TestContext testContext) throws Exception;
}

@TransactionConfiguration

Esta anotación se utiliza para indicar el nombre del bean que debe actuar como gestor de transacciones:

@TransactionConfiguration(transactionManager="gestorTransacciones")
public class Tests {
...

Sólo tiene sentido si se quiere utilizar un bean distinto al que se proporciona por defecto y que tiene por nombre «transactionManager».

@Rollback

Esta anotación sirve para modificar la acción realizada por defecto con las transacciones al terminar un método, que consiste en ejecutar un rollback para deshacerlas.

Se puede utilizar un argumento en la anotación para que no se ejecute el rollback:

@Test
@Rollback(false)
public void test() {
...

@BeforeTransaction

Esta anotación permite marcar un método para que sea ejecutado antes de crear la transacción utilizada para la ejecución de las pruebas de la clase:

@BeforeTransaction
public void antes() {
...

@AfterTransaction

Esta anotación permite marcar un método para que sea ejecutado después de terminar la transacción utilizada para la ejecución de las pruebas de la clase:

@AfterTransaction
public void despues() {
...