Przeczytałem tutaj kilka wątków na temat metod statycznych i myślę, że rozumiem problemy, które mogą powodować niewłaściwe użycie / nadmierne użycie metod statycznych. Ale tak naprawdę nie do końca zrozumiałem, dlaczego trudno wyśmiewać metody statyczne.
Wiem, że inne fałszywe frameworki, takie jak PowerMock, mogą to zrobić, ale dlaczego Mockito nie może?
Czytam ten artykuł , ale autor wydaje się być religijnie przeciwny temu słowu static
, może to moje słabe zrozumienie.
Świetne byłoby proste wyjaśnienie / link.
Odpowiedzi:
Myślę, że powodem może być to, że fałszywe biblioteki obiektów zwykle tworzą symulacje poprzez dynamiczne tworzenie klas w czasie wykonywania (przy użyciu cglib ). Oznacza to, że albo implementują interfejs w czasie wykonywania (to robi EasyMock, jeśli się nie mylę), albo dziedziczą od klasy do kpiny (to właśnie robi Mockito, jeśli się nie mylę). Oba podejścia nie działają dla elementów statycznych, ponieważ nie można ich zastąpić za pomocą dziedziczenia.
Jedynym sposobem na wyśmiewanie statyki jest modyfikacja kodu bajtowego klasy w czasie wykonywania, co, jak sądzę, jest nieco bardziej zaangażowane niż dziedziczenie.
Zgaduję, że warto ...
źródło
Jeśli musisz wyśmiewać metodę statyczną, jest to silny wskaźnik złego projektu. Zwykle kpisz z zależności testowanej klasy. Jeśli testowana klasa odwołuje się do metody statycznej - na przykład java.util.Math # sin - oznacza to, że testowana klasa potrzebuje dokładnie tej implementacji (na przykład dokładności w porównaniu do prędkości). Jeśli chcesz oderwać się od konkretnej implementacji zatoki, prawdopodobnie potrzebujesz interfejsu (widzisz, dokąd to zmierza)?
źródło
Poważnie myślę, że to też zapach kodu, jeśli trzeba kpić z metod statycznych.
Jedyny raz, kiedy wydaje mi się to przesadą, to liby takie jak Guava, ale nie powinieneś kpić z tego rodzaju, ponieważ jest to część logiki ... (rzeczy takie jak Iterables.transform (..))
W ten sposób twój własny kod pozostaje czysty, możesz wyśmiewać wszystkie swoje zależności w czysty sposób i masz warstwę antykorupcyjną przeciwko zależnościom zewnętrznym. Widziałem PowerMocka w praktyce i wszystkie klasy, do których potrzebowaliśmy, były źle zaprojektowane. Również integracja PowerMock czasami powodowała poważne problemy
(np. Https://code.google.com/p/powermock/issues/detail?id=355 )
PS: To samo dotyczy metod prywatnych. Nie sądzę, żeby testy powinny wiedzieć o szczegółach prywatnych metod. Jeśli klasa jest tak złożona, że kusi, aby kpić z prywatnych metod, prawdopodobnie jest to znak, aby ją podzielić ...
źródło
@Inject SomeDependency
oraz w mojej konfiguracji, którą definiujębind(SomeDependency.class).in(Singleton.class)
. Dlatego jeśli jutro nie będzie już Singletonem, zmieniam jedną konfigurację i to wszystko.Foo.getInstance()
wszędzie. Właśnie napisałem singleton w odpowiedzi, aby odeprzeć argument „ale metoda statyczna nie wymaga tworzenia wielu obiektów opakowania”. Również koncepcyjnie dla mnie nie ma różnicy między metodą statyczną a metodą instancji w singletonie, tyle że nie można wyśmiewać tego współpracownika singletona. Ale singleton czy nie nie jest absolutnie tym, o co starałem się zrobić, chodzi o to, aby wstrzykiwać i wyśmiewać współpracowników i nie wywoływać metod statycznych, jeśli utrudnia to testowanie.Mockito zwraca obiekty, ale statyczny oznacza „poziom klasy, a nie poziom obiektu”. Zatem mockito da wyjątek zerowy dla statycznego.
źródło
W niektórych przypadkach metody statyczne mogą być trudne do przetestowania, szczególnie jeśli trzeba je wyśmiewać, dlatego większość fałszywych ram nie obsługuje ich. Uważam, że ten post na blogu jest bardzo przydatny w określaniu, jak kpić z metod i klas statycznych.
źródło