2012-01-13 13 views
5

En una prueba JUnit en mi aplicación Spring, me gustaría insertar una gran cantidad de datos en un método de configuración, y luego usarlo para probar en contra. Sin embargo, lo que se hace en el método @Before parece que revertirse después de cada prueba, incluso si anoto el método con @Rollback(false)@Rollback (falso) no funciona en @Antes de usar SpringJUnit4ClassRunner

Aquí hay una versión simplificada de lo que estoy tratando de hacer:

public class TestClass 
{ 
    @Autowired 
    MyService service; 

    @Before 
    public void setup() 
    { 
     if(service.getById(1) == null) 
     { 
     Thing thing = new Thing(); 
     thing.setId(1); 
     service.create(new Thing(1)) 
     } 
    } 
} 

También intenté usar @BeforeClass, pero eso requiere que el método sea estático y se ejecute antes de invocar cualquier método @Autowired setter, por lo que no puedo acceder a los servicios a los que debo llamar cuando se ejecuta @BeforeClass.

Intenté usar @PostConstruct, pero existen problemas para tener una transacción disponible (y mi configuración es tal que una sesión de Hibernate solo está disponible cuando se inicia una transacción). Extrañamente, parecía que una sesión estaba disponible, pero dos objetos obtenidos dentro de la misma sesión no eran iguales, lo que significaba que la memoria caché de primer nivel de Hibernate parecía estar fallando, o que cada operación estaba ocurriendo en una sesión separada. @BeforeTransaction parecían exhibir el mismo comportamiento.

+0

¿Dónde pones la anotación '@ Rollback', a nivel de clase o método? – Ralph

+0

@Ralph He intentado ambos en el método 'setup()' '@Rollback (false)', y luego también en la clase al mismo tiempo que anoto métodos de prueba con '@ Rollback'. –

+0

¿Alguna vez encontró una manera de lograr esto? – Arjan

Respuesta

2

The Spring TransactionalTestExecutionListener es responsable de gestionar la transacción para las pruebas de Junit. Utiliza dos métodos (beforeTestMethod y afterTestMethod) para iniciar y finalizar la transacción para cada una de las pruebas de Junit.

En cuanto a @Before anotación parece que funciona como éste, se aplica la @Rollback atributo especificado en el método de ensayo para la configuración de métodos de con @Before anotación

que tienen este ejemplo para explicar el proceso , Tengo dos métodos de prueba uno con (retrotraer falso el otro con retrotraer verdadero)

 @RunWith(SpringJUnit4ClassRunner.class) 
     @ContextConfiguration(loader=AnnotationConfigContextLoader.class, classes={SpringConfig.class}) 
     @Transactional 
     public class MyTest 
     { 

     @Before 
     public void setUp() 
     { 
      //When executing this method setUp 
      //The transaction will be rolled back after rollBackTrue Test 
      //The transaction will not be rolled back after rollBackFalse Test 
     } 


     @Test 
     @Rollback(true) 
     public void rollBackTrue() 
     { 
      Assert.assertTrue(true); 
     } 

     @Test 
     @Rollback(false) 
     public void rollBackFalse() 
     { 
      Assert.assertTrue(true); 
     } 
    } 
+0

Hola Prasana. Gracias por su respuesta, pero eso no puede ser correcto. Si service.create() no era parte de una transacción, ¿por qué se retrotrae por defecto después de cada prueba? El problema es * querer * que esté fuera de una transacción, por lo que no se revierte, pero no se puede averiguar cómo. –

+0

Lo siento, mi prueba me echó y también debería haber leído la documentación del método, cambié la respuesta con un ejemplo. –