Yay testlerinde ortam değişkeni veya sistem özelliği nasıl ayarlanır?


95

Konuşlandırılmış bir WAR'ın XML Spring yapılandırmasını kontrol eden bazı testler yazmak istiyorum. Maalesef bazı çekirdekler, bazı ortam değişkenlerinin veya sistem özelliklerinin ayarlanmasını gerektirir. @ContextConfiguration ile uygun test stilini kullanırken bahar fasulyesi başlatılmadan önce bir ortam değişkenini nasıl ayarlayabilirim?

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }

Uygulama bağlamını ek açıklamalarla yapılandırırsam, yay bağlamı başlatılmadan önce bir şeyler yapabileceğim bir kanca görmüyorum.

Yanıtlar:


128

Sistem özelliğini statik başlatıcıda başlatabilirsiniz:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext {

    static {
        System.setProperty("myproperty", "foo");
    }

}

Statik başlatıcı kodu, yay uygulama içeriği başlatılmadan önce çalıştırılacaktır.


14
Aptal ben - Tamam, bu işe yarar. Daha da iyisi: muhtemelen @BeforeClasssistem özelliğini ayarlamak için bir @AfterClassyöntem ve onu kaldırmak için bir yöntem de işe yarayacak ve kendisinden sonra güzelce temizlenecektir. (Yine de denemedim.)
Hans-Peter Störr

1
@BeforeClass'ı denedim - ve diğer özellikler test örneğinde ayarlanmadan önce sistem özelliklerini ayarlamak için iyi çalıştı
wbdarby

Bunun için teşekkürler. Statik şey işe yaramadı ama @BeforeClass ile küçük bir yöntem işe yaradı!
Midhun Agnihotram

Log4j2 yapılandırma dosyası özelliği değiştirilirse bu mekanizma çalışmaz. Görünüşe göre Spring yine de statik kod parçasından önce yükleniyor (ve bu nedenle yanlış günlüğe kaydediliyor).
lucasvc

88

Bahar 4.1'den başlayarak bunu yapmanın doğru yolu bir @TestPropertySourceaçıklama kullanmaktır .

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
@TestPropertySource(properties = {"myproperty = foo"})
public class TestWarSpringContext {
    ...    
}

Spring belgelerinde ve Javadocs'ta @TestPropertySource konusuna bakın .


2
Bu açıklama ayrıca bir özellikler dosyası yolunu da destekler.
MigDus

2
Testler sırasında Spring Cloud Config Client etiketini değiştirebilirim@TestPropertySource(properties={"spring.cloud.config.label=feature/branch"})
Marcello de Sales

5
İyi cevap, ama ne yazık ki benim için işe yaramadı, Bahar 4.2.9'u kullanarak mülk her zaman boştu. Yalnızca statik blok çalıştı ... Uygulama özellikleri için çalıştı, ancak sistem özellikleri için çalışmadı.
Gregor

İlk önce statik sürümü (işe yarayan) gördüm ve denedim, ancak bu Ek Açıklama daha da temiz ve çok daha fazla tercih edilebilir (benim için, aynı zamanda bir cazibe gibi çalıştığı için).
BAERUS

4
Bu, Environment"Ortam değişkeninden" farklı bir özellik sağlar .
OrangeDog

12

Bir sistem özelliğini başlatmak için bir test ApplicationContextInitializer da kullanılabilir:

public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext)
    {
        System.setProperty("myproperty", "value");
    }
}

ve ardından bunu, Spring bağlamı yapılandırma dosyası konumlarına ek olarak test sınıfında yapılandırın:

@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...)
@RunWith(SpringJUnit4ClassRunner.class)
public class SomeTest
{
...
}

Bu şekilde, tüm birim testleri için belirli bir sistem özelliğinin ayarlanması gerekiyorsa, kod tekrarından kaçınılabilir.


Bu, Spring Boot 2.x ve Junit 5.x ile de mükemmel şekilde çalışır ( test dilimleme ek açıklamalarını kullanarak @SpringBootTestveya bunlardan herhangi birini kullanarak )
Wim Deblauwe

11

Buradaki tüm cevaplar şu anda sadece ayarlanması daha karmaşık olan ortam değişkenlerinden farklı olan sistem özelliklerinden bahsediyor, özellikle. testler için. Neyse ki, bunun için aşağıdaki sınıf kullanılabilir ve sınıf dokümanları iyi örnekler içerir

EnvironmentVariables.html

@SpringBootTest ile çalışmak üzere değiştirilmiş belgelerden hızlı bir örnek

@SpringBootTest
public class EnvironmentVariablesTest {
   @ClassRule
   public final EnvironmentVariables environmentVariables = new EnvironmentVariables().set("name", "value");

   @Test
   public void test() {
     assertEquals("value", System.getenv("name"));
   }
 }

EnvironmentVariables kuralları bir üçüncü taraf kitaplığının bir parçasıdır, JVM belleğindeki ortamın önbelleğe alınan değerlerini değiştirmek için hile yansıması kullanır ve gerçek ortam değişkenlerini bile değiştirmez. Bu yüzden kullanmak istemiyorum ya da kimseye tavsiye etmem.
Hıristiyan

4

Değişkenlerinizin tüm testler için geçerli olmasını istiyorsanız, application.propertiestest kaynakları dizininizde (varsayılan olarak src/test/resources:) şuna benzer bir dosyaya sahip olabilirsiniz :

MYPROPERTY=foo

Bu, daha sonra @TestPropertySourceveya benzer bir yöntemle tanımlamanız olmadıkça yüklenecek ve kullanılacaktır - özelliklerin tam olarak yüklenme sırası, Bahar dokümantasyonu bölüm 24'te bulunabilir. Haricileştirilmiş Yapılandırma .


2

Sistem özelliklerini VM bağımsız değişkenleri olarak ayarlayabilirsiniz.

Projeniz bir maven projesiyse, test sınıfını çalıştırırken aşağıdaki komutu çalıştırabilirsiniz:

mvn test -Dapp.url="https://stackoverflow.com"

Test sınıfı:

public class AppTest  {
@Test
public void testUrl() {
    System.out.println(System.getProperty("app.url"));
    }
}

Tutulma sırasında bireysel test sınıfı veya yöntemi çalıştırmak istiyorsanız, o zaman:

1) Çalıştır'a gidin -> Yapılandırmayı Çalıştır

2) Sol tarafta Junit bölümünün altında Test sınıfınızı seçin.

3) aşağıdakileri yapın:

görüntü açıklamasını buraya girin


2

Birim Testleri için, uygulamayı çalıştıran bir sunucu olmadığından "mvn clean install" yaptığımda Sistem değişkeni henüz somutlaştırılmıyor. Dolayısıyla, Sistem özelliklerini ayarlamak için bunu pom.xml'de yapmam gerekiyor. Şöyle:

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.