Estoy intentando construir algunas pruebas alrededor de algunas entidades auditadas. Mi problema es que solo se envían auditorías en una transacción comprometida.Pruebas de integración con Hibernate Envers
Necesito crear/editar algunos objetos de prueba, confirmar la transacción y luego verificar las revisiones.
¿Cuál es el mejor enfoque para las pruebas de integración con envers?
Actualización: Aquí hay una clase de prueba realmente mala y no determinista de lo que quiero lograr. Preferiría hacer esto sin depender del orden de los métodos de prueba
Primero cree una cuenta y account_transaction en una sola transacción. Ambas entradas auditadas son para la revisión 1.
Segunda actualización de account_transaction en una nueva transacción. La entrada auditada está en la revisión 2.
En tercer lugar, cargue la cuenta auditada en la revisión 1 y haga algo con ella.
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/testApplicationContext.xml"})
public class TestAuditing {
@Autowired
private AccountDao accountDao;
@PersistenceContext
private EntityManager entityManager;
@Test
@Rollback(false)
public void first() {
Account account = account("Test Account", "xxxxxxxx", "xxxxxx");
AccountTransaction transaction = transaction(new Date(), Deposit, 100, "Deposit");
account.setTransactions(newArrayList(transaction));
accountDao.create(account);
}
@Test
@Rollback(false)
public void second() {
Account account = accountDao.getById(1L);
AccountTransaction transaction = account.getTransactions().get(0);
transaction.setDescription("Updated Transaction");
accountDao.update(account);
}
@Test
public void third() {
AuditReader reader = AuditReaderFactory.get(entityManager);
List<Number> accountRevisions = reader.getRevisions(Account.class, 1L);
//One revision [1]
List<Number> transactionRevisions = reader.getRevisions(AccountTransaction.class, 1L);
//Two revisions [1, 2]
Account currentAccount = accountDao.getById(1L);
Account revisionAccount = (Account) reader.createQuery().forEntitiesAtRevision(Account.class, 1).getSingleResult();
System.out.println(revisionAccount);
}
Compruebe [esto] (http://nurkiewicz.blogspot.com/2011/11/spring-pitfalls-transactional-tests.html) fuera - auto promoción descarada. –
Gracias por la respuesta Tomasz, todavía no estoy seguro de cómo resolver mi problema de su publicación en el blog. Realmente no tengo un problema con los falsos positivos de la carga diferida, etc., más con la realización de algunas transacciones para configurar algunos datos de prueba de auditoría. Tal vez me perdí algo obvio en tu publicación. –
Bueno, desplaza mi artículo a 'DbResetRule' - mi idea es evitar el uso de las pruebas JUnit' @ Transactional' y simplemente dejar que el código confirme y retrotraiga las transacciones. Obviamente, esto hace que las pruebas no sean repetibles y frágiles. Pero en lugar de revertir los cambios, propongo que se vacíe la base de datos y se restaure antes o después de cada prueba. El código está en Scala, pero esto es solo una idea general. Avíseme si esto es lo que está buscando, por lo que elaboraré un poco más en una respuesta por separado. –