Rozumiem, że @VisibleForTesting nie jest pożądany, ponieważ zmienia interfejs klasy tylko do celów testowych. Najlepiej byłoby przetestować interfejs, który faktycznie używamy. Ale jaka byłaby dobra alternatywa?Alternatywy dla @VisibleForTesting
Odpowiedz
Używasz @VisibleForTesting
, kiedy, jak powiedziałeś, chcesz przetestować część kodu, której nie ujawniasz użytkownikowi końcowemu. Jeśli chcesz go przetestować, najprawdopodobniej oznacza to, że jest skomplikowany, a przynajmniej nie jest trywialny. Dwa rozwiązania będą następujące:
- Podziel metodę, w której wywołuje się ją na kilka sposobów, dzięki czemu czujesz się bardziej komfortowo, jeśli nie masz jednej, dużej metody robienia wielu rzeczy naraz.
- Sprawdź, czy możesz przenieść zachowanie do zewnętrznego obiektu, który się nim zajmuje.
Bardzo lubię # 2, gdy rzeczy zaczynają się komplikować, ponieważ mogę mieć zewnętrzny obiekt, który mogę przetestować i upewnić się, że działa bez konieczności odsłonięcia go przez nasz interfejs.
Powiedziawszy to, czasami zachowania nie gwarantują ekstrakcji metody do nowego obiektu i używasz @VisibleForTesting
tylko po to, aby zaoszczędzić czas. Doświadczenie mówi, kiedy warto to zrobić (lub nie).
+1 za przejście do obiektu zewnętrznego. Jest to jedna z tych korzystnych dla obu stron sytuacji, gdy pisanie dobrych testów poprawia kod, który testujesz. – millhouse
Ta odpowiedź nie dotyczy przypadku, gdy trzeba dodać dodatkowe metody modyfikatora do klasy, aby umożliwić jej konfigurowanie do testowania. Dzieje się tak w szczególności w połączeniu z iniekcją zależności, gdy twój kod produkcyjny używa @Autowired do zależności między kablami, gdzie jako kod testowy musi problematycznie ustawić je oddzielnie w każdej metodzie testu odpowiedniego testu jednostkowego, aby przetestować różne scenariusze. –
Możesz wysłać kod do [CodeReview.SE] (http://codereview.stackexchange.com/). – palacsint
Naprawdę miałem na myśli ogólne pytanie, w przeciwieństwie do konkretnego fragmentu kodu wymagającego refaktoryzacji. – Thiago