Mam fragment kodu Java, który używa zmiennej środowiskowej, a zachowanie kodu zależy od wartości tej zmiennej. Chciałbym przetestować ten kod z różnymi wartościami zmiennej środowiskowej. Jak mogę to zrobić w JUnit?
Widziałem ogólnie sposoby ustawiania zmiennych środowiskowych w Javie , ale bardziej interesuje mnie aspekt testów jednostkowych, zwłaszcza biorąc pod uwagę, że testy nie powinny ze sobą kolidować.
Odpowiedzi:
Biblioteka Zasady systemu zapewnia JUnit regułę do ustawiania zmiennych środowiskowych.
Zastrzeżenie: jestem autorem reguł systemowych.
źródło
import org.junit.contrib.java.lang.system.EnvironmentVariables;
Będziesz musiał dodać zależnośćcom.github.stefanbirkner:system-rules
w swoim projekcie. Jest dostępny w MavenCentral.Typowym rozwiązaniem jest utworzenie klasy, która zarządza dostępem do tej zmiennej środowiskowej, którą można następnie symulować w klasie testowej.
Testowana klasa pobiera następnie zmienną środowiskową przy użyciu klasy Environment, a nie bezpośrednio z System.getenv ().
źródło
W podobnej sytuacji, jak ta, w której musiałem napisać przypadek testowy zależny od zmiennej środowiskowej , próbowałem wykonać następujące czynności:
Zmarnowałem dzień stosując powyższe dwa podejścia, ale bezskutecznie. Wtedy Maven przyszedł mi na ratunek. Możemy ustawić zmienne środowiskowe lub właściwości systemu za pomocą pliku POM Maven , który moim zdaniem jest najlepszym sposobem na wykonanie testów jednostkowych dla projektu opartego na Maven . Poniżej wpis, który zrobiłem w pliku POM .
Po tej zmianie ponownie uruchomiłem Test Cases i nagle wszystko działało zgodnie z oczekiwaniami. Dla informacji czytającego, ja zbadałem to podejście w Maven 3.x , więc nie mam pojęcia o Maven 2.x .
źródło
Myślę, że najczystszym sposobem na to jest użycie Mockito.spy (). Jest to trochę lżejsze niż tworzenie oddzielnej klasy do kpiny i przekazywania.
Przenieś pobieranie zmiennej środowiskowej do innej metody:
Teraz w swoim teście jednostkowym zrób to:
źródło
Wydaje mi się, że nie było to jeszcze wspominane, ale możesz też użyć Powermockito :
Dany:
Możesz wykonać następujące czynności:
źródło
when(System.getenv("FOO_VAR_1")).thenReturn("test-foo-var-1")
powodujeorg.mockito.exceptions.misusing.MissingMethodInvocationException: when() requires an argument which has to be 'a method call on a mock'.
błądOddziel kod Java od zmiennej środowiskowej, zapewniając bardziej abstrakcyjny czytnik zmiennych, który można zrealizować za pomocą EnvironmentVariableReader kodu do testowania odczytów.
Następnie w swoim teście możesz podać inną implementację czytnika zmiennych, który dostarcza wartości testowe.
Pomóc w tym może zastrzyk zależności.
źródło
Ta odpowiedź na pytanie Jak ustawić zmienne środowiskowe w Javie? zapewnia sposób na zmianę (niemodyfikowalnej) mapy w System.getenv (). Więc chociaż NAPRAWDĘ nie zmienia wartości zmiennej środowiskowej systemu operacyjnego, może być używany do testów jednostkowych, ponieważ zmienia to, co zwróci System.getenv .
źródło
Mam nadzieję, że problem został rozwiązany. Po prostu pomyślałem, żeby powiedzieć moje rozwiązanie.
źródło
Chociaż uważam, że ta odpowiedź jest najlepsza dla projektów Maven, można ją również osiągnąć za pomocą refleksu (przetestowanego w Javie 8 ):
źródło
theCaseInsensitiveEnvironment
i zamiast tego ma poletheEnvironment
, takie jak następujące: `` envMap = new HashMap <> (); Class <?> Clazz = Class.forName ("java.lang.ProcessEnvironment"); Pole theEnvironmentField = clazz.getDeclaredField ("theEnvironmentField"); Pole theUnmodifiableEnvironmentField = clazz.getDeclaredField ("theUnmodifiableEnvironment"); removeStaticFinalAndSetValue (theEnvironmentField, envMap); removeStaticFinalAndSetValue (theUnmodifiableEnvironmentField, envMap); ``Cóż, możesz użyć metody setup (), aby zadeklarować różne wartości twojego env. zmienne w stałych. Następnie użyj tych stałych w metodach testowych używanych do testowania różnych scenariuszy.
źródło
Jeśli chcesz, aby pobrać informacje o zmiennej środowiskowej w Javie, można wywołać metodę:
System.getenv();
. Jako właściwości ta metoda zwraca Map zawierającą nazwy zmiennych jako klucze, a wartości zmiennych jako wartości map. Oto przykład :Metoda
getEnv()
może również pobierać argument. Na przykład :Do testów zrobiłbym coś takiego:
źródło
Używam System.getEnv (), aby pobrać mapę i zachowuję jako pole, więc mogę z niej kpić:
źródło