2010-08-17 11 views
6

Abbiamo implementato JUnit4 nella nostra applicazione che utilizza il core Spring & JPA con DB2. Abbiamo bisogno di testare una funzionalità completa che recupera i dati da un database e si fonde in un altro database.jent test case transazione non commessa - nessun errore

Il caso di test per il recupero dei dati dal primo database è scritto ed è in esecuzione senza errori, ma i record non vengono memorizzati nel secondo database.

Attuazione

La classe TestCase abbiamo incluso le seguenti annotazioni per rendere il caso di test eseguito in una transazione, se necessario,

@RunWith(SpringJUnit4ClassRunner.class) 
@TestExecutionListeners({ 
     DependencyInjectionTestExecutionListener.class,  
     TransactionalTestExecutionListener.class}) 
@ContextConfiguration(locations={""}) 
@TransactionConfiguration(transactionManager="defaultTransactionManager", defaultRollback=false) 
@Transactional 

Nell'applicazione abbiamo una classe Manager per eseguire questo operazione con il metodo doSynch(). Da quel metodo, il metodo txStore() della classe crudHelper verrà chiamato per inizializzare e chiamare il metodo doStore() (nella stessa classe) per unire l'entità nel database.

seguenti sono le dichiarativa transazionale attraverso questo caso la logica di test

TestCase testSynch() - @Transactional(propagation=Propagation.SUPPORTS) 
Manager doSynch() - @Transactional(propagation=Propagation.NEVER) 
CRUDHelper txStore() - @Transactional(propagation=Propagation.REQUIRED) 
      doStore() - No Transactional annotation 

doSynch() è contrassegnato come MAI come in quel punto non necessita di alcuna operazione e in ulteriori livelli come nel CRUDHelper transazione può essere contrassegnato come RICHIESTO per garantire che una transazione sia disponibile.

Problema

qui quando corriamo il banco di prova, che chiama il metodo del Gestore doSynch() per verificare la funzionalità, flusso completo sta lavorando perfetto, tranne che i record non vengono uniti e nessun errore sono gettati.

Il metodo Manager quando chiamato da un JSP funziona alla grande. Abbiamo anche testato chiamando txStore() direttamente dal caso di test e funziona anche bene.

Ti preghiamo di farci sapere se la gestione delle transazioni non è corretta o se è necessario risolvere questo problema sarà di maggiore aiuto. Inoltre, aggiornami se il problema o l'ambiente non sono chiari. Grazie in anticipo.!!

risposta

6

Contrassegni i tuoi metodi con l'annotazione @Rollback?

Dal JavaDoc:

annotazione di prova per indicare se o no la transazione per il metodo annotato test deve essere eseguito il rollback dopo che il metodo di prova è stata completata. Se true, la transazione sarà annullata; in caso contrario, verrà eseguita la commit della transazione .

+0

Grazie 4 ur risposta. Abbiamo impostato il valore defaultRollback come falso nel livello di classe TestCase e non abbiamo fornito alcun altro rollback per i livelli del metodo. Ma solo il caso in cui funziona è aggiungendo il metodo @Transactional a doStore(). Siamo in grado di vedere le query di inserimento stampate solo in questo caso e l'annotazione di doStore non viene rimossa nemmeno una singola query di inserimento viene stampata quando si chiama em.merge(). Ma non potevamo fare quel cambiamento come è nella nostra classe framework freezed. Qualsiasi aiuto sarebbe apprezzabile. !! – raksja

Problemi correlati