2011-12-22 8 views
21

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

+0

Możesz wysłać kod do [CodeReview.SE] (http://codereview.stackexchange.com/). – palacsint

+0

Naprawdę miałem na myśli ogólne pytanie, w przeciwieństwie do konkretnego fragmentu kodu wymagającego refaktoryzacji. – Thiago

Odpowiedz

37

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:

  1. 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.
  2. 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).

+12

+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

+1

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. –