2010-05-27 12 views
6

Abbiamo un'applicazione creata usando spring/Hibernate/MySQL, ora vogliamo testare il livello DAO, ma qui ci sono alcune lacune che dobbiamo affrontare.Test di DAO Hibernate, senza creare l'universo attorno ad esso

Considerare il caso di utilizzo di più oggetti collegati tra loro, ad esempio: Book ha Pages.

  • L'oggetto di pagina non può esistere senza il libro come book_id è FK obbligatorio in Page.
  • Per testare una pagina Devo creare un libro.

Questo semplice file di utilizzo è facile da gestire, ma se inizi a costruire una Libreria, finché non crei l'intero universo che circonda il Libro e la Pagina, non puoi testarlo!

Quindi per testare Pagina;

  • Crea libreria
  • sezione Crea
  • Crea Genere
  • Crea Autore
  • Crea Prenota
  • Crea pagina
  • Ora pagina di prova.

C'è un modo semplice per passare questa "creazione dell'universo" e testare l'oggetto della pagina in isolamento. Voglio anche essere in grado di testare gli HQL relativi a Page. ad esempio: si suppone

SELECT new com.test.BookPage (book.id, page.name) FROM Book book, Page page. 

JUnit per l'esecuzione in isolamento, quindi devo scrivere il codice per costruire tutti gli oggetti di supporto nel caso di test per creare la pagina. Qualche consiglio su come accelerare il processo.

Modifica: La primavera segue la filosofia del rollback delle transazioni dopo che i test sono stati eseguiti, annullando tutte le modifiche. I cambiamenti dello schema sono attesi man mano che ci sviluppiamo ulteriormente, voglio essere in grado di testarlo regolarmente con il db di produzione (backup!).

+0

perché wiki della comunità? – roufamatic

risposta

5

Ho appena finito un progetto con questa configurazione esatta. Abbiamo ottenuto un grande successo utilizzando un database HSQLDB stand-alone per i test unitari e quindi disattivando l'integrità referenziale sullo schema per tali test.

Dal momento che si sta utilizzando Primavera, questi sono i passi:

  1. creare un nuovo file di configurazione del contesto per il test. Impostare lo stato di ibernazione su create-drop per lo schema in questa configurazione.
  2. Crea il tuo test di junit. Eredita da AbstractTransactionalJUnit4SpringContextTests, la più grande classe astratta della storia dell'universo e annota la classe con il tuo nuovo @ContextConfiguration. Utilizzare anche l'annotazione @TransactionConfiguration per eseguire ogni test in una transazione con un rollback automatico.
  3. eseguire il comando "SET REFERENTIAL_INTEGRITY FALSE;" tramite la proprietà ereditata simpleJdbcTemplate nel metodo @Before.
  4. dedicare il resto delle @Before alle chiamate simpleJdbcTemplate che impostano il database.Si noti che non è più necessario specificare ogni colonna di riferimento, solo ciò che si sta testando!
  5. Infine, scrivi i tuoi test unitari contro i tuoi DAO.

Ecco alcuni riferimenti che vi porterà a muoversi in questa direzione:

Come al solito con questa roba, ottenendo la configurazione appena a destra è il disco parte. Ma una volta che tutto funziona, sarai un tester per lo styling!

+0

Non mi sento a mio agio disattivando l'integrità referenziale anche per i test. –

+0

A ciascuno il suo. Ho scoperto che da una prospettiva di prova unitaria il mio apparecchio di prova è stato tagliato a metà quando ho rimosso l'integrità referenziale. Poiché ero interessato solo a testare le query HQL, non la configurazione dello schema DB, ha funzionato molto bene. Inoltre, dato che si tratta di un sistema di database completamente diverso, in memoria, a questo punto, non ci si deve preoccupare di danneggiare i dati di produzione. – roufamatic

+0

Non lasciamo che lo stato di ibernazione generi lo schema, semplicemente mappiamo l'oggetto su SQL ed eseguiamo la convalida hbm2ddl per assicurarci che sia conforme allo standard. Vogliamo anche assicurarci che la configurazione dello schema sia corretta, fa parte della fase di test. –

3

Le estensioni di Unitils a junit o testng hanno un ottimo supporto per questo. Consentono di definire i set di dati ottimizzati per la classe in esame in modo tale da richiedere solo la parte dell'universo che la classe sta visualizzando e quindi inizializza il database prima dell'avvio dei test.

cassa: link text

stiamo utilizzando e funziona bene. Molto meglio dei "MockRepositories" che abbiamo usato prima, che non testano l'HQL e, cosa importante, i comportamenti di transazione in letargo.

+0

Le unitil sembrano promettenti, lasciami esplorare di più e tornare da te. –

+0

Unitils offre molto più del semplice materiale di database, ad es. abbinamenti di raccolta indulgenti. È una buona cosa avere nella cintura degli attrezzi. –

Problemi correlati