Z wywiadu z Kentem Beckem w najnowszym wydaniu Java Magazine:
Binstock: Porozmawiajmy o mikrousługach. Wydaje mi się, że pierwsze testowanie mikrousług byłoby skomplikowane w tym sensie, że niektóre usługi, aby funkcjonować, będą wymagały obecności całej gamy innych usług. Czy sie zgadzasz?
Beck: Wydaje się, że to ten sam zestaw zawodów związanych z posiadaniem jednej dużej klasy lub wielu małych klas.
Binstock: Racja, chyba że chyba, tutaj musisz użyć okropnej liczby prób, aby móc skonfigurować system, w którym możesz przetestować daną usługę.
Beck: Nie zgadzam się. Jeśli jest to imperatywny styl, musisz użyć wielu kpin. W funkcjonalnym stylu, w którym zależności zewnętrzne są gromadzone razem wysoko w łańcuchu połączeń, nie sądzę, że jest to konieczne. Myślę, że można uzyskać dużo zasięgu z testów jednostkowych.
Co on ma na myśli? Jak styl funkcjonalny może uwolnić cię od kpienia z zewnętrznych zależności?
Odpowiedzi:
Czysta funkcja to taka, która:
Załóżmy, że piszemy kod do obsługi logowania użytkownika, w którym chcemy sprawdzić, czy podana nazwa użytkownika i hasło są prawidłowe, i uniemożliwić zalogowanie się użytkownika, jeśli będzie zbyt wiele nieudanych prób. W trybie rozkazującym nasz kod może wyglądać następująco:
Jest całkiem jasne, że nie jest to czysta funkcja:
username
ipassword
kombinacji, ponieważ wynik zależy również od rekordu użytkownika przechowywanego w bazie danych.Zauważ też, że aby przetestować tę funkcję, musimy wykpić dwa wywołania bazy danych
FindUser
iRecordFailedLoginAttempt
.Gdybyśmy zmienili kod na bardziej funkcjonalny, moglibyśmy otrzymać coś takiego:
Zauważ, że chociaż
UserLogin
funkcja ta nadal nie jest czysta,UserLoginPure
jest ona teraz funkcją czystą, w wyniku czego logika uwierzytelniania podstawowego użytkownika może być testowana jednostkowo bez konieczności kpienia z zewnętrznych zależności. Jest tak, ponieważ interakcja z bazą danych jest obsługiwana wyżej w stosie wywołań.źródło