Test di @Transazione e repository
-
21-12-2019 - |
Domanda
Ho visto che @Transactional
è meglio posizionato allo strato di servizio, ma il problema è che non sono in grado di testare correttamente i miei repository perché le modifiche non vengono impegnate.
Durante il test del metodo save()
del repository, voglio utilizzare find()
per verificare se l'entità è stata salvata correttamente, ma poiché le modifiche save()
non vengono impegnate al database, find()
restituisce NULL.
Le uniche soluzioni che vedo è aggiungere l'annotazione @Transactional
:
- .
- sul metodo repository
save()
- sul metodo
testSave()
=> Ma IMO questo è sbagliato perché modifica il comportamento
Forse sto fraintendendo qualcosa, ho iniziato ad imparare Java due giorni fa.
Soluzione
Non è necessario che le modifiche commesse nel database hai solo bisogno delle query emesse nella stessa transazione.Successivamente non dovresti usare lo stesso mezzo con cui si memorizza i dati per recuperare i dati.Fondamentalmente dovresti usare JDBC semplice per testare se è stato aggiunto.
public class TestClass extends AbstractTransactionalSpringJUnit4ContextTests {
private TestRepository repo;
@Test
public void testSave() {
int rowCount = countRowsInTable("your-table-name");
repo.save(yourEntity);
repo.flush();
int rowCountAfter = countRowsInTable("your-table-name");
assertTrue(rowCountAfter - rowCount == 1); // Or whatever you like to verify the row was added
}
.
Nota: se non si estende JpaRepository
non è presente alcun metodo flush
, invece è possibile iniettare il EntityManager
in TestCase e chiamare flush
su lì.
Invece di verificare solo il conteggio della riga che è possibile utilizzare anche il jdbcTemplate
dal AbstractTransactionalJunit4SpringContextTests
per recuperare la riga appena aggiunta e confrontare con ciò che ti aspettavi.
Altri suggerimenti
Ecco perché inizierai a testare i test dell'unità scrivendo il codice di produzione.Ma mentre hai iniziato a imparare Java solo due giorni fa, non dovresti davvero entrare nella gestione delle transazioni subito dal pipistrello.Impara prima le basi e il design.