वसंत परीक्षणों में पर्यावरण चर या सिस्टम संपत्ति कैसे सेट करें?


93

मैं कुछ परीक्षण लिखना चाहता हूं जो एक तैनात WAR के XML स्प्रिंग कॉन्फ़िगरेशन की जांच करता है। दुर्भाग्य से कुछ बीन्स को कुछ पर्यावरण चर या सिस्टम गुण सेट करने की आवश्यकता होती है। जब मैं @ContextConfiguration के साथ सुविधाजनक परीक्षण शैली का उपयोग कर रहा हूं, तो स्प्रिंग बीन्स को आरंभ करने से पहले मैं एक पर्यावरण चर कैसे सेट कर सकता हूं?

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

यदि मैं एप्लिकेशन संदर्भ को एनोटेशन के साथ कॉन्फ़िगर करता हूं, तो मुझे हुक दिखाई नहीं देता है जहां मैं स्प्रिंग संदर्भ आरंभ होने से पहले कुछ कर सकता हूं।

जवाबों:


127

आप सिस्टम गुण को स्थैतिक इनिशियलाइज़र में आरंभ कर सकते हैं:

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

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

}

वसंत एप्लिकेशन के संदर्भ को आरंभीकृत करने से पहले स्टैटिक इनिशियलाइज़र कोड निष्पादित किया जाएगा।


14
मूर्खतापूर्ण मुझे - ठीक है, यह काम करेगा। इससे भी बेहतर: शायद @BeforeClassसिस्टम प्रॉपर्टी को सेट करने का @AfterClassतरीका और इसे हटाने का एक तरीका भी काम करेगा, और खुद के बाद अच्छी तरह से साफ हो जाएगा। (हालांकि, इसे बाहर की कोशिश नहीं की।)
हंस-पीटर स्टॉर

1
@BeforeClass की कोशिश की - और परीक्षण के उदाहरण में सेट किए गए अन्य गुणों से पहले सिस्टम गुण सेट करने के लिए यह ठीक काम किया
wbdarby

इसके लिए धन्यवाद। स्थिर काम नहीं किया, लेकिन @BeforeClass के साथ एक छोटा सा तरीका काम किया!
मिधुन अग्निहोत्रम

Log4j2 कॉन्फ़िगरेशन फ़ाइल प्रॉपर्टी को बदलते समय यह तंत्र काम नहीं करता है। लगता है कि वसंत को कोड के उस स्थिर टुकड़े से पहले (और इसलिए गलत तरीके से लॉगिंग) लोड किया जा रहा है।
लुकासिक्व

86

ऐसा करने का सही तरीका, स्प्रिंग 4.1 के साथ शुरू करना, @TestPropertySourceएनोटेशन का उपयोग करना है ।

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

में @TestPropertySource देखें स्प्रिंग डॉक्स और Javadocs


2
यह एनोटेशन भी गुण फ़ाइल पथ का समर्थन करता है।
मिग्डस

2
मैं परीक्षण के दौरान स्प्रिंग क्लाउड कॉन्फिग क्लाइंट लेबल का उपयोग कर सकता था@TestPropertySource(properties={"spring.cloud.config.label=feature/branch"})
मार्सेलो डे सेल्स

4
अच्छा जवाब, लेकिन दुख की बात है मेरे लिए काम नहीं किया, स्प्रिंग 4.2.9 का उपयोग करते हुए, संपत्ति हमेशा खाली थी। केवल स्थैतिक ब्लॉक ने काम किया ... आवेदन गुणों के लिए काम किया, लेकिन सिस्टम गुणों के लिए नहीं।
ग्रेगर

पहले मैंने स्टैटिक वर्जन को देखा और आजमाया (जो काम किया), लेकिन यह एनोटेशन और भी बेहतर ढंग से क्लीनर है (मेरे लिए, क्योंकि यह एक आकर्षण की तरह भी काम करता है)।
BAERUS

3
यह एक Environmentसंपत्ति प्रदान करता है, जो "पर्यावरण चर" के लिए अलग है।
ऑरेंजडॉग

11

एक सिस्टम गुण को प्रारंभ करने के लिए एक परीक्षण ApplicationContextInitializer का उपयोग भी कर सकता है:

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

और फिर इसे स्प्रिंग संदर्भ कॉन्फ़िगरेशन फ़ाइल स्थानों के अलावा परीक्षण वर्ग पर कॉन्फ़िगर करें:

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

इस तरह से कोड दोहराव से बचा जा सकता है अगर सभी यूनिट परीक्षणों के लिए एक निश्चित प्रणाली संपत्ति निर्धारित की जानी चाहिए।


यह स्प्रिंग बूट 2.x और जुनिट 5.x के साथ पूरी तरह से काम करता है (उपयोग @SpringBootTestया परीक्षण
स्लाइस

10

यहां सभी उत्तर वर्तमान में केवल सिस्टम गुणों के बारे में बात करते हैं जो पर्यावरण चर से अलग हैं जो सेट करने के लिए अधिक जटिल हैं, esp। परीक्षणों के लिए। शुक्र है, इसके लिए नीचे के वर्ग का उपयोग किया जा सकता है और कक्षा के डॉक्स के अच्छे उदाहरण हैं

EnvironmentVariables.html

डॉक्स से एक त्वरित उदाहरण, @SpringBootTest के साथ काम करने के लिए संशोधित

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

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

एनवायरनमेंवरीबल्स नियम एक तीसरे पक्ष के पुस्तकालय का हिस्सा है, जेवीएम मेमोरी में पर्यावरण के कैश्ड मूल्यों को बदलने के लिए हैकी प्रतिबिंब का उपयोग करता है और वास्तविक पर्यावरण चर भी नहीं करता है। इसलिए, मैं इसका उपयोग नहीं करना चाहूंगा और न ही किसी को ऐसा करने की सलाह दूंगा।
ईसाई

4

यदि आप चाहते हैं कि आपके चर सभी परीक्षणों के लिए मान्य हों, तो आपके पास application.propertiesआपके परीक्षण संसाधन निर्देशिका में एक फ़ाइल हो सकती है (डिफ़ॉल्ट रूप से src/test/resources) : जो कुछ इस तरह दिखाई देगी:

MYPROPERTY=foo

यह तब तक लोड और उपयोग किया जाएगा जब तक कि आपके पास @TestPropertySourceया इसी तरह की विधि के माध्यम से परिभाषाएँ न हों - सटीक क्रम जिसमें गुण लोड किए गए हैं, स्प्रिंग दस्तावेज़ अध्याय 24 में पाया जा सकता है । बाहरी कॉन्फ़िगरेशन


2

आप सिस्टम गुणों को VM तर्क के रूप में सेट कर सकते हैं।

यदि आपकी परियोजना एक मावेन परियोजना है तो आप परीक्षण वर्ग को चलाने के दौरान निम्नलिखित कमांड निष्पादित कर सकते हैं:

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

टेस्ट क्लास:

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

यदि आप व्यक्तिगत परीक्षा कक्षा या विधि को ग्रहण में चलाना चाहते हैं तो:

1) रन -> रन कॉन्फ़िगरेशन पर जाएं

2) बाईं ओर जूनिट सेक्शन के तहत अपना टेस्ट क्लास चुनें।

3) निम्नलिखित करें:

यहां छवि विवरण दर्ज करें


2

यूनिट टेस्ट के लिए, सिस्टम वैरिएबल को अभी तक इंस्टेंट नहीं किया गया है जब मैं "mvan क्लीन इंस्टॉल" करता हूं क्योंकि एप्लिकेशन को चलाने वाला कोई सर्वर नहीं है। तो सिस्टम गुण सेट करने के लिए, मुझे इसे pom.xml में करने की आवश्यकता है। इस तरह:

<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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.