Jakie są najlepsze ramy do tworzenia fałszywych obiektów w Javie? Dlaczego? Jakie są zalety i wady poszczególnych ram?
źródło
Jakie są najlepsze ramy do tworzenia fałszywych obiektów w Javie? Dlaczego? Jakie są zalety i wady poszczególnych ram?
Korzystam z Mockito .
Kiedy próbowałem dowiedzieć się o JMock i EasyMock, zauważyłem, że krzywa uczenia się jest nieco stroma (choć może to tylko ja).
Lubię Mockito ze względu na jego prostą i czystą składnię, którą byłem w stanie dość szybko zrozumieć. Minimalna składnia została zaprojektowana tak, aby bardzo dobrze obsługiwać typowe przypadki, chociaż kilka razy, gdy musiałem zrobić coś bardziej skomplikowanego, znalazłem to, co chciałem, było obsługiwane i łatwe do zrozumienia.
Oto (skrócony) przykład ze strony głównej Mockito:
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
Nie ma nic prostszego.
Jedynym poważnym minusem, jaki mogę wymyślić, jest to, że nie będzie on kpił z metod statycznych.
Jestem twórcą PowerMock, więc oczywiście muszę to polecić! :-)
PowerMock rozszerza zarówno EasyMock, jak i Mockito o możliwość kpienia z metod statycznych , ostatecznych, a nawet prywatnych. Obsługa EasyMock jest kompletna, ale wtyczka Mockito wymaga nieco więcej pracy. Planujemy również dodać obsługę JMock.
PowerMock nie jest przeznaczony do zastępowania innych frameworków, raczej może być użyty w trudnych sytuacjach, gdy inne framework'y nie pozwalają na kpiny. PowerMock zawiera również inne przydatne funkcje, takie jak tłumienie statycznych inicjatorów i konstruktorów.
źródło
Witryna projektu JMockit zawiera wiele informacji porównawczych dla aktualnych zestawów narzędzi do kpin.
W szczególności sprawdź macierz porównania funkcji , która obejmuje EasyMock, jMock, Mockito, Unitils Mock, PowerMock i oczywiście JMockit. Staram się, aby był on dokładny i aktualny, o ile to możliwe.
źródło
Odniosłem sukces z JMockit .
Jest całkiem nowy, więc jest trochę surowy i niedokumentowany. Używa ASM, aby dynamicznie przedefiniować kod bajtowy klasy, dzięki czemu może wyśmiewać wszystkie metody, w tym statyczne, prywatne, konstruktory i statyczne inicjalizatory. Na przykład:
Posiada interfejs Oczekiwania, który umożliwia także scenariusze nagrywania / odtwarzania:
Minusem jest to, że wymaga Java 5/6.
źródło
Możesz także rzucić okiem na testowanie przy użyciu Groovy. W Groovy możesz łatwo wyśmiewać interfejsy Java za pomocą operatora „as”:
Oprócz tej podstawowej funkcjonalności Groovy oferuje o wiele więcej na szyderczym froncie, w tym potężne
MockFor
iStubFor
klasy.http://docs.codehaus.org/display/GROOVY/Groovy+Mocks
źródło
Zacząłem używać mocków w EasyMock . Łatwo to zrozumieć, ale powtórka była dość irytująca. Mockito usuwa to, ma również czystszą składnię, ponieważ wygląda na to, że czytelność była jednym z jej głównych celów. Nie mogę wystarczająco podkreślić, jak ważne jest to, ponieważ większość programistów poświęci swój czas na czytanie i utrzymanie istniejącego kodu, a nie jego tworzenie.
Kolejną miłą rzeczą jest to, że interfejsy i klasy implementacyjne są obsługiwane w ten sam sposób, w przeciwieństwie do EasyMock, w którym nadal trzeba pamiętać (i sprawdzać), aby użyć rozszerzenia klasy EasyMock.
Niedawno rzuciłem okiem na JMockit i chociaż lista funkcji prania jest dość wyczerpująca, myślę, że ceną tego jest czytelność wynikowego kodu i konieczność pisania więcej.
Dla mnie Mockito trafia w dobry punkt, jest łatwy do pisania i czytania oraz radzenia sobie z większością sytuacji, w których wymagany będzie większość kodu. Używanie Mockito z PowerMock byłoby moim wyborem.
Jedną rzeczą do rozważenia jest to, że narzędzie, które wybierzesz, jeśli tworzysz sam lub w małym zgranym zespole, może nie być najlepszym rozwiązaniem dla dużej firmy z programistami o różnych poziomach umiejętności. Czytelność, łatwość użycia i prostota wymagałyby więcej uwagi w tym drugim przypadku. Nie ma sensu uzyskiwać ostatecznego frameworka, jeśli wiele osób ostatecznie go nie używa lub nie utrzymuje testów.
źródło
W pracy intensywnie korzystamy z EasyMock i EasyMock Class Extension i jesteśmy z tego bardzo zadowoleni. Zasadniczo daje wszystko, czego potrzebujesz. Spójrz na dokumentację, jest bardzo ładny przykład, który pokazuje wszystkie funkcje EasyMock.
źródło
Użyłem JMock wcześnie. Próbowałem Mockito przy moim ostatnim projekcie i podobało mi się. Bardziej zwięzłe, bardziej czyste. PowerMock obejmuje wszystkie potrzeby, których nie ma w Mockito, takie jak wyśmiewanie kodu statycznego, wyśmiewanie tworzenia instancji, wyśmiewanie końcowych klas i metod. Mam więc wszystko, czego potrzebuję do wykonania mojej pracy.
źródło
Lubię JMock, ponieważ jesteś w stanie ustawić oczekiwania. Jest to całkowicie odmienne od sprawdzania, czy w niektórych fałszywych bibliotekach została wywołana metoda. Za pomocą JMock możesz pisać bardzo wyszukane oczekiwania. Zobacz jmock cheat-sheat .
źródło
Tak, Mockito to świetny framework. Używam go razem z hamcrestem i guice Google do konfiguracji moich testów.
źródło
Najlepszym rozwiązaniem drwiny jest zlecenie, aby maszyna wykonała całą pracę dzięki zautomatyzowanym testom opartym na specyfikacji. Jeśli chodzi o Javę, zobacz ScalaCheck i środowisko Reductio zawarte w bibliotece Functional Java . Dzięki zautomatyzowanym ramom testowym opartym na specyfikacji dostarczasz specyfikację testowanej metody (właściwość, która powinna być prawdziwa), a struktura automatycznie generuje testy, a także próbne obiekty.
Na przykład następująca właściwość testuje metodę Math.sqrt, aby sprawdzić, czy pierwiastek kwadratowy z dowolnej liczby dodatniej n kwadrat jest równy n.
Kiedy dzwonisz
propSqrt.check()
, ScalaCheck generuje setki liczb całkowitych i sprawdza twoją własność dla każdej z nich, automatycznie również upewniając się, że skrzynki brzegowe są dobrze pokryte.Mimo że ScalaCheck jest napisany w języku Scala i wymaga kompilatora Scala, łatwo jest z nim przetestować kod Java. Struktura Reductio w Functional Java to czysta implementacja Java tych samych pojęć.
źródło
Mockito zapewnia również opcję stubowania, dopasowywania argumentów (jak anyInt () i anyString ()), sprawdzania liczby wywołań (times (3), atLeastOnce (), never ()) i innych .
Przekonałem się również, że Mockito jest prosty i czysty .
Jedną rzeczą, która mi się nie podoba w Mockito, jest to, że nie można upuścić metod statycznych .
źródło
Dla czegoś nieco innego, możesz użyć JRuby i Mocha, które są połączone w JtestR, aby napisać testy kodu Java w ekspresyjnym i zwięzłym Ruby. Istnieje kilka przydatnych przykładów kpienia z JtestR tutaj . Zaletą tego podejścia jest to, że drwiny z konkretnych klas są bardzo proste.
źródło
Zacząłem używać mocków za pomocą JMocka, ale ostatecznie przeszedłem na EasyMock. EasyMock był po prostu tym - łatwiejszy - i zapewniał bardziej naturalną składnię. Od tamtej pory nie zmieniłem się.
źródło