Czyszczenie bazy (H2) po każdym teście

0

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ł.

2
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

1

@KamilAdam:

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

0
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 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

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.

5

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:

  1. save encji poprzez repo
  2. find na repo
  3. 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

0

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

1

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?

0
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ć.

2

Wstrzykujesz repository -> jakiś spockowy setup() gdzie wołasz deleteAll() na repo. Troche nie rozumiem co tu ma @Transactional do rzeczy

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.