2012-05-23 23 views
12

Sto usando Spring 3.2, Hibernate e JUnit 4.Spring @Transactional non funziona nel test JUnit?

La mia classe Dao è la seguente:

@Transactional public class SomeDaoImpl implements SomeDao {

Le operazioni di aggiornamento su questo lavoro se eseguito direttamente da applicazioni web. Tuttavia, sto vedendo che i test di integrazione junit che esercitano i metodi di aggiornamento non mantengono effettivamente le modifiche. Qualcosa sta facendo rotolare le transazioni quando vengono eseguiti i metodi junit?

risposta

22

Entro reference, le transazioni sono non mantenute in contesti di test in primavera. Come accennato, anche se inusuale, se è ancora necessario farlo, è possibile utilizzare @TransactionConfiguration e @Rollback per modificare il comportamento predefinito.

11

I DAO non devono essere transazionali. Come può un DAO sapere se dovrebbe partecipare a una transazione più ampia?

I servizi devono possedere transazioni nella tipica architettura a strati Spring.

È tipico eseguire i test dell'unità per i database in modo tale che eseguano il rollback. Non vuoi che i test modifichino il database, a meno che tu non abbia impostato un database di test che puoi eliminare e ricreare a piacimento.

La domanda dovrebbe essere: in che modo i test, come scritto, eseguono la transazione? Se non commetti mai, non vedrai mai i record.

+0

scusa avrei dovuto aggiungere che sto usando l'ibernazione per la persistenza. – Nilesh

+0

Non cambia la mia risposta. – duffymo

+2

In ogni caso non era previsto un commento sulla tua risposta :-). A proposito la buona pratica che hai menzionato sopra è ben pubblicata. Penso che ti sei perso nel cercare di essere pedante e hai dimenticato di rispondere alla vera domanda! – Nilesh

Problemi correlati