Chciałbym napisać kilka testów, które sprawdzą konfigurację XML Spring wdrożonej WAR. Niestety, niektóre ziarna wymagają ustawienia pewnych zmiennych środowiskowych lub właściwości systemu. Jak ustawić zmienną środowiskową przed zainicjowaniem fasolek wiosennych, używając wygodnego stylu testowego z @ContextConfiguration?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }
Jeśli skonfiguruję kontekst aplikacji z adnotacjami, nie widzę zaczepu, w którym mogę coś zrobić przed zainicjowaniem kontekstu sprężynowego.
java
spring
environment-variables
spring-test
Hans-Peter Störr
źródło
źródło
@BeforeClass
metoda ustawiania właściwości systemu i@AfterClass
metoda jej usuwania również zadziała i ładnie posprząta po sobie. (Jednak nie wypróbowałem tego.)Właściwym sposobem, aby to zrobić, począwszy od Spring 4.1, jest użycie
@TestPropertySource
adnotacji.@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:whereever/context.xml") @TestPropertySource(properties = {"myproperty = foo"}) public class TestWarSpringContext { ... }
Zobacz @TestPropertySource w dokumentacji Spring i Javadocs .
źródło
@TestPropertySource(properties={"spring.cloud.config.label=feature/branch"})
Environment
właściwość, która różni się od „zmiennej środowiskowej”.Można także użyć testowego ApplicationContextInitializer do zainicjowania właściwości systemowej:
public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.setProperty("myproperty", "value"); } }
a następnie skonfiguruj go w klasie testowej oprócz lokalizacji pliku konfiguracji kontekstu Spring:
@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...) @RunWith(SpringJUnit4ClassRunner.class) public class SomeTest { ... }
W ten sposób można uniknąć duplikowania kodu, jeśli dla wszystkich testów jednostkowych należy ustawić określoną właściwość systemu.
źródło
@SpringBootTest
lub dowolnej adnotacji testowej wycinania )Wszystkie odpowiedzi tutaj dotyczą obecnie tylko właściwości systemu, które różnią się od zmiennych środowiskowych, które są bardziej złożone, szczególnie. do testów. Na szczęście można do tego użyć poniżej klasy, a dokumentacja klasy ma dobre przykłady
EnvironmentVariables.html
Szybki przykład z dokumentacji, zmodyfikowany do pracy z @SpringBootTest
@SpringBootTest public class EnvironmentVariablesTest { @ClassRule public final EnvironmentVariables environmentVariables = new EnvironmentVariables().set("name", "value"); @Test public void test() { assertEquals("value", System.getenv("name")); } }
źródło
Jeśli chcesz, aby twoje zmienne były ważne dla wszystkich testów, możesz mieć
application.properties
plik w katalogu zasobów testowych (domyślnie:),src/test/resources
który będzie wyglądał mniej więcej tak:Zostanie on następnie załadowany i użyty, chyba że masz definicje za pomocą
@TestPropertySource
lub podobnej metody - dokładną kolejność ładowania właściwości można znaleźć w rozdziale 24 dokumentacji sprężyny . Konfiguracja zewnętrzna .źródło
Możesz ustawić właściwości systemu jako argumenty maszyny wirtualnej.
Jeśli twój projekt jest projektem maven, możesz wykonać następujące polecenie podczas uruchamiania klasy testowej:
mvn test -Dapp.url="https://stackoverflow.com"
Klasa testu:
public class AppTest { @Test public void testUrl() { System.out.println(System.getProperty("app.url")); } }
Jeśli chcesz uruchomić indywidualną klasę testową lub metodę w eclipse, to:
1) Przejdź do Uruchom -> Uruchom konfigurację
2) Po lewej stronie wybierz klasę testu w sekcji Junit.
3) wykonaj następujące czynności:
źródło
W przypadku testów jednostkowych wystąpienie zmiennej systemowej nie jest jeszcze tworzone, gdy wykonuję „czystą instalację mvn”, ponieważ nie ma serwera, na którym działa aplikacja. Aby ustawić właściwości systemu, muszę to zrobić w pom.xml. Tak jak to:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.21.0</version> <configuration> <systemPropertyVariables> <propertyName>propertyValue</propertyName> <MY_ENV_VAR>newValue</MY_ENV_VAR> <ENV_TARGET>olqa</ENV_TARGET> <buildDirectory>${project.build.directory}</buildDirectory> </systemPropertyVariables> </configuration> </plugin>
źródło