Jaki jest najlepszy sposób na czyszczenie bazy (H2) po każdym teście (używam Spring Data JPA)? Co prawda użycie @Transactional działa, ale z tego co czytałem, nie jest to zbyt dobry pomysł.
Sampeteq napisał(a):
Co prawda użycie @Transactional działa, ale z tego co czytałem, nie jest to zbyt dobry pomysł.
Pajpierw pytanie pomocnicze, może trochę nie na temat. Co rozumiesz przez to że @Transactional ? Jeśli to że nie zatwierdzasz tranzakcji to nic nigdy nie zapisujesz do bazy i jest to słaby test :P
UPDATE próbowałeś https://stackoverflow.com/questions/8523423/reset-embedded-h2-database-periodically ?
Zwłaszcza podoba mi się:
The command: SHUTDOWN
You can execute it using
RunScript.execute(jdbc_url, user, password, "classpath:shutdown.sql", "UTF8", false);
I do run it every time when the Suite of tests is finished using @AfterClass
Popieram myśl, ze resetowac bazę testową trzeba niskopoziomowo - mam na myśli niejasny "wysokopoziomowy" ??? pomysł kol. z @Transactional
, kiedy zadziała nie wiadomo jak, gdyby założyć np "parzystą ilość błędów" choćby w zamotanych adnotacajach, czy inny problemach na tym poziomie
KamilAdam napisał(a):
Sampeteq napisał(a):
Co prawda użycie @Transactional działa, ale z tego co czytałem, nie jest to zbyt dobry pomysł.
Pajpierw pytanie pomocnicze, może trochę nie na temat. Co rozumiesz przez to że @Transactional ? Jeśli to że nie zatwierdzasz tranzakcji to nic nigdy nie zapisujesz do bazy i jest to słaby test :P
UPDATE próbowałeś https://stackoverflow.com/questions/8523423/reset-embedded-h2-database-periodically ?
Zwłaszcza podoba mi się:
The command: SHUTDOWN
You can execute it usingRunScript.execute(jdbc_url, user, password, "classpath:shutdown.sql", "UTF8", false);
I do run it every time when the Suite of tests is finished using @AfterClass
Mam na myśli, to, że klasa z testami ma adnotację @Transactional i dzięki temu po każdym teście baza wraca do pierwotnego statanu.
Nie bardzo mi się podoba rozwiązanie z tym skryptem. Szukam maksymalnie prostego sposobu.
Jak masz @Transactional
na teście i używasz jakiegoś JPA, to nawet możesz dropnąć tabelę w H2 a test pewnie dalej będzie na zielono. Widziałem już mniej więcej takie przypadki:
- save encji poprzez repo
- find na repo
- asserty czy repo zwróciło to co zapisaliśmy wcześniej
Problem w tym że "find" zwrócił sobie obiekt z cache Hibernata, a insert nawet jeszcze nie dotknął bazy danych :D
A takl na poboczu wątku.
Jak może działać @Transactional
na JPA/Hibernate wyobrażam sobie (chyba). Sesja hibernate jest dobrze znana Springowi, i będzie umiał zatwierdzić / rollbackować.
A jak na styku z bazą jest zupełnie nieznana Springowi / Tomcatowi libka, albo wręcz surowe Connection - jak to jest zaimplementowane?
Pytam bo nie wiem
Niskopoziomowe wyłączanie całej bazy danych to imho droga do nikąd. Pomyśl sobie, że nagle z H2 przesiadacie się na test containers i bazą na dockerze.
Dalej każdorazowo będziesz ją ubijał, podnosił na nowo i odtwarzał schemat? No nie. A skoro w przypadku test containers tego nie robisz to czemu masz robić przy h2?
RequiredNickname napisał(a):
Niskopoziomowe wyłączanie całej bazy danych to imho droga do nikąd. Pomyśl sobie, że nagle z H2 przesiadacie się na test containers i bazą na dockerze.
Dalej każdorazowo będziesz ją ubijał, podnosił na nowo i odtwarzał schemat? No nie. A skoro w przypadku test containers tego nie robisz to czemu masz robić przy h2?
Nie, nie o to chodzi. Ja nie chcę za każdym razem ją odtwrzać tylko rekordy wyczyścić.
Wstrzykujesz repository -> jakiś spockowy setup()
gdzie wołasz deleteAll() na repo. Troche nie rozumiem co tu ma @Transactional
do rzeczy