W kpiarskich frameworkach możesz kpić z obiektu lub go szpiegować . Jaka jest różnica między tymi dwoma i kiedy powinienem / powinienem używać jednego nad drugim?
Patrząc na przykład na Mockito , widzę podobne rzeczy przy użyciu szpiegów i kpiny , ale nie jestem pewien, czy istnieje różnica między nimi.
unit-testing
mocking
tdd
Vivin Paliath
źródło
źródło
Odpowiedzi:
Mock obiekt całkowicie zastępuje mockowaną klasę, zwracając zapisane lub domyślne wartości. Możesz stworzyć makietę z „powietrza”. To jest najczęściej używane podczas testów jednostkowych.
Podczas szpiegowania bierzesz istniejący obiekt i „zastępujesz” tylko niektóre metody. Jest to przydatne, gdy masz ogromną klasę i chcesz tylko kpić z niektórych metod (częściowe mockowanie). Pozwolę sobie zacytować dokumentację Mockito :
W razie wątpliwości używaj prób.
źródło
Mockito ostrzega, że częściowe mockowanie nie jest dobrą praktyką i powinieneś zrewidować swoją architekturę zorientowaną obiektowo. Do testowania starszego kodu zaleca się szpiegowanie (lub częściowe mockowanie) .
źródło
Spróbuję wyjaśnić na przykładzie tutaj:
Tutaj mieliśmy początkowy rzeczywisty obiekt
list
, w którym dodaliśmy jeden element i oczekiwaliśmy jednego rozmiaru.My spy obiektu rzeczywistego znaczenia, że możemy pouczać, która metoda być zgaszone . Więc zadeklarowaliśmy, że mamy metodę -
size()
na obiekcie szpiegowskim, który zwróci 10, bez względu na rzeczywisty rozmiar.Krótko mówiąc, będziesz szpiegować rzeczywisty obiekt i usuwać niektóre z metod .
źródło
Źródła : http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/
W przypadku używania obiektów pozorowanych domyślne zachowanie metody, gdy nie jest to skrót, to nic nie rób. Proste oznacza, że jeśli jest to metoda void, to nic nie zrobi, gdy wywołasz metodę lub jeśli jest to metoda z wartością zwrotną, może zwrócić wartość null, pustą lub domyślną.
Oczywiście w przypadku obiektów szpiegowskich, ponieważ jest to prawdziwa metoda, kiedy nie blokujesz metody, wywoła ona prawdziwe zachowanie metody. Jeśli chcesz zmienić i kpić z metody, musisz ją zablokować.
źródło
Mocks Aren't Stubs autorstwa Martina Fowlera
źródło
Szpiedzy mają dwie definicje. Pierwsza polega na tym, że wywoływana jest prawdziwa metoda, a druga, gdzie nie jest wywoływana żadna funkcjonalność i zwracane są tylko wartości null lub null równoważne, ale metody zostały wywołane, a ich stan został zarejestrowany, zwykle tak, jak metoda x została wywołana y razy.
źródło
W Mockito, jeśli przypiszesz dowolny obiekt do zmiennej instancji Mock Object, nie ma to wpływu na Mock Object.
Ale w przypadku Szpiega, jeśli przypiszesz jakikolwiek obiekt do zmiennej instancji Obiektu Szpiega, wpłynie to na Obiekt Szpiega, ponieważ Szpieg działa jak modyfikacja obiektu w czasie rzeczywistym.
Jako przykład odniesienia są
źródło