Guarde el estado en el método @before, haga la @test, luego revierta los cambios en @after
Frecuentes
Visto 706 veces
1
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!
1 Respuestas
2
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.
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 java spring junit or haz tu propia pregunta.
Entonces, ¿cuál es el problema? ¿El código no funciona? ¿Se lanza un error? - bbaja42
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)" - nook