Guarde el estado en el método @before, haga la @test, luego revierta los cambios en @after

Me preguntaba si esto es posible. Esta es mi primera pregunta, así que tengan paciencia conmigo si no sigo exactamente el protocolo. Puedo revertir mis transacciones con una plantilla de transacción. Pero ahora lo que quiero hacer es guardar un estado en el método etiquetado como @before y luego revertirlo en el método @after.

Por ejemplo, esto es lo que tenía antes:

      _transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
     protected void doInTransactionWithoutResult(TransactionStatus transactionStatus)
     {

                Object transactionStatusSavepoint = transactionStatus.createSavepoint();
                //do some work
                transactionStatus.rollbackToSavepoint(transactionStatusSavepoint);
      }
     });

Todo esto funciona bien y bien. Ahora me gustaría hacer esto:

@Before
    public void beforeTest() {
        _template.execute(new TransactionCallbackWithoutResult() {

            @Override
            protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {

                _transactionStatusSavepoint = _transactionStatus.createSavepoint();
            }
        });

@Test
public void foo(){//do some stuff}

@After
    public void afterTest() {
    _transactionStatus.rollbackToSavepoint(_transactionStatusSavepoint);
}

Por favor, hágamelo saber si no entiende o le gustaría dar más detalles. ¡Gracias por adelantado!

preguntado el 12 de junio de 12 a las 20:06

Entonces, ¿cuál es el problema? ¿El código no funciona? ¿Se lanza un error? -

Se arroja un error. "Argumento no válido en llamada JDBC: excepción de punto de guardado 3B001: especificación no válida". "No se pudo revertir al punto de guardado de JDBC; la excepción anidada es java.sql.SQLException: argumento no válido en la llamada de JDBC: excepción de punto de guardado 3B001: especificación no válida en org.springframework.jdbc.datasource.JdbcTransactionObjectSupport.rollbackToSavepoint(JdbcTransactionObjectSupport.java:132)" -

1 Respuestas

El estado de la transacción no será válido una vez que se complete doInTransactionWithoutResult, por lo que no puede usarlo en su método afterTest.

Parece que estás usando Spring para tu prueba. Spring viene con un corredor de prueba que puede revertir una transacción cuando se completan las pruebas.

Prueba de primavera

Respondido el 12 de junio de 12 a las 21:06

¿Por qué no puede guardar el estado de la transacción en una variable global? Soy bastante nuevo en la primavera y probablemente aceptaré esta respuesta, pero me gustaría saber. - rincón

@publ1c_stat1c El método de ejecución en TransactionTemplate confirma la transacción si TransactionCallback no genera una excepción. Si se lanza una excepción, la transacción se revierte. Por lo tanto, no puede revertir una transacción que ya está comprometida. - Michael Krussel

Tiene sentido. ¡Muchas gracias por su ayuda! - rincón

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.