Cześć, już kilka razy kilka osób tu na forum (szczególnie @Shalom) pisali o tym, żeby testować kontolery http za pomocą normalnego uderzenia do naszego serwera niż używania mock mvc.
Argumenty (z którymi się zresztą zgadzam i sam zacząłem tak testować):
- robimy realne uderzenie nie pomijając niczego w przeciwieństwie do mock mvc, która omija trochę warstw tego połączenia
- kod niższego poziomu mamy zamknięty w naszym cliencie
- sam test jest mega zwięzły i zachęca programistę do napisania większej ilości tych testów, bo jest po prostu łatwo (nie ma tych wszystkich linijek z mock mvc, które musimy pisać za każdym razem)
Ostatnio jednak miałem ciekawą rozmowę z kolegami z pracy, którzy nadal wolą mock mvc, ponieważ testuje on realnego jsona, który jest zwracany na frontend (w przypadku kiedy nasz endpoint jest wystawiany dla frontu, a nie jako komunikacja z innymi mikroserwisami). Jeśli np zmienimy nazwę pola w wyjściowym dto z endpointu to nasze testy z wykorzystaniem napisanego klienta http nadal przejdą, jeśli użyliśmy opcji refactor name
w Intellij, a na froncie już będzie problem. Podobnie jeśli mamy jakieś serializatory daty np - tu podobnie jest problem w takich przypadkach. Test nadal tego nie wykryje. Tu mock mvc ma taki plus, że faktycznie on sprawdza po prostu tego jsona i to wykryje.
Mój pomysł wstępnie był taki, żeby tego mock mvc zatrudnić do 1 testu sprawdzającego serializację, ale wtedy np logikę biznesową możemy już sprawdzać wstrzykując do testu bean z serwisem albo nawet bean z kontrolerem i w wyniku tego w ogóle nie potrzebujemy jednak tego clienta pisać.
I w sumie też nie do końca potrafię znaleźć kontretne, realne przypadki gdzie uderzenie do naszego serwera normalnie przez http clienta zamiast przez mock mvc sprawdzi nam coś czego nie sprawdzi mock mvc. Gdzie jest ta magia mock mvc, która może zakłamać nam testy?