Sto provando a costruire alcuni test intorno ad alcune entità controllate. Il mio problema è che envers controlla solo su un commit di transazione.Test di integrazione con Hibernate Envers
Devo creare/modificare alcuni oggetti di test, eseguire il commit della transazione e quindi controllare le revisioni.
Qual è l'approccio migliore ai test di integrazione con envers?
Aggiornamento: Ecco una classe di test davvero non valida e non deterministica di ciò che voglio ottenere. Preferirei farlo senza fare affidamento sull'ordine dei metodi di test
Per prima cosa creare un account e account_transaction in una singola transazione. Entrambe le voci controllate sono per la revisione 1.
In secondo luogo l'account_transaction in una nuova transazione. La voce controllata è alla revisione 2.
In terzo luogo, caricare l'account controllato alla revisione 1 e fare qualcosa con esso.
@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);
}
Controllare [questo] (http://nurkiewicz.blogspot.com/2011/11/spring-pitfalls-transactional-tests.html) out - auto-promozione spudorata. –
Grazie per la risposta Tomasz, non sono ancora sicuro di come risolvere il mio problema dal tuo post sul blog però. In realtà non ho un problema con i falsi positivi del caricamento lazy, ecc., In realtà con alcune transazioni per l'impostazione di alcuni dati di test di controllo. Forse mi sono perso qualcosa di ovvio nel tuo post? –
Bene, scorri il mio articolo in 'DbResetRule' - la mia idea è di evitare l'uso dei test JUnit di' @ Transactional' e di lasciare solo il tuo codice di commit e di rollback delle transazioni. Ovviamente questo rende i test non ripetibili e fragili. Ma invece di ripristinare le modifiche, propongo di scaricare il database e ripristinarlo prima/dopo ogni test. Il codice è in Scala, ma questa è solo un'idea generale. Fatemi sapere se questo è ciò che state cercando, quindi elaborerò un po 'di più in una risposta separata. –