W przypadku wykonywania prostych testów kpowanie z warstwy dostępu do bazy danych jest całkowicie dopuszczalne. Wołasz getName()
, to nazywa wyśmiewanego DAO i zwraca „John” dla imienia i „Smith” dla nazwiska, składa je i wszystko jest idealne. Nie ma potrzeby testowania w tym miejscu bazy danych.
Sprawy stają się nieco bardziej, gdy logika staje się nieco bardziej złożona. Co jeśli masz metodę „createOrUpdateUser (...)”. Jeśli wyśmiewałeś bazę danych, możesz sprawdzić, czy dana metoda została wywołana jeden raz z pewnym parametrem, gdy próbka nie zwraca żadnych obiektów, a inna baza danych jest wywoływana w bazie danych, gdy zwraca istniejący obiekt. To zaczyna przechodzić do tej niewyraźnej linii, w której może być łatwiej (szczególnie, jeśli już tam była), rozwinąć wyspecjalizowaną bazę danych pamięci i przetestować ten kod ze wstępnie skonfigurowanymi danymi.
W niektórych kodach, nad którymi pracowałem (w punkcie sprzedaży), mieliśmy resumeSuspededTransaction(...)
metodę. Spowodowałoby to wyciągnięcie transakcji z bazy danych do obiektu (i jego składników) i zaktualizowanie bazy danych. Wyśmiewaliśmy go, a gdzieś w kodzie krył się błąd z serializacją i deserializacją danych przechodzących do bazy danych (zmieniliśmy typ, który był różnie serializowany w bazie danych).
Makieta nie pokazała nam błędu, ponieważ powracała z radosną ścieżką - serializuj transakcję, przechowuj ją w makiecie, deserializuj z makiety, testuj, czy są równe. Jednak, gdy serializujesz obiekt z wiodącym zerem do bazy danych, upuszcza je, a następnie rekombinuje z powrotem do łańcucha bez zer. Wykryliśmy błąd bez bazy danych przez rozwiązywanie problemów (nie było to trudne do wykrycia, kiedy już wiedzieliśmy, że tam jest).
Później umieściliśmy tam bazę danych i zdaliśmy sobie sprawę, że błąd nigdy nie przeszedłby tego testu junit, gdybyśmy zamiast tego wybrali się do bazy danych w pamięci.
W bazach pamięci mają zalety:
- można je szybko rozkręcić (bez potrzeby DBA do konfigurowania kont, tabel itp.) do testowania
- dane można wstępnie skonfigurować dla tego testu
- test nie musi się martwić o wycofanie testu po zakończeniu
- każdy test ma swoją własną bazę danych w pamięci, więc nie musisz się martwić, że dwa testy działają jednocześnie
- można je uruchamiać w systemach, które nie mają łączności z prawdziwymi bazami danych