डिफ़ॉल्ट स्प्रिंग-बूट Application.properties सेटिंग्स को जूनिट टेस्ट में ओवरराइड करें


198

मेरे पास एक स्प्रिंग-बूट एप्लिकेशन है जहां डिफ़ॉल्ट गुण application.propertiesक्लासपाथ (src / main / resource / application.properties) में एक फ़ाइल में सेट किए गए हैं ।

मैं अपने JUnit परीक्षण में कुछ डिफ़ॉल्ट सेटिंग्स को एक test.propertiesफ़ाइल (src / test / resource / test.properties) में घोषित गुणों के साथ ओवरराइड करना चाहूंगा

मैं सामान्य रूप से अपने Junit टेस्ट्स के लिए एक समर्पित विन्यास वर्ग है, जैसे

package foo.bar.test;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {

}

मैं पहली बार सोचा कि का उपयोग कर @PropertySource("classpath:test.properties")TestConfig कक्षा में चाल करना होगा, लेकिन इन गुणों application.properties सेटिंग अधिलेखित नहीं होगा (देखें वसंत-बूट संदर्भ डॉक्टर - 23. externalized विन्यास )।

फिर मैंने -Dspring.config.location=classpath:test.propertiesपरीक्षण का उपयोग करते समय उपयोग करने की कोशिश की । यह सफल था - लेकिन मैं इस प्रणाली की संपत्ति को प्रत्येक परीक्षण निष्पादन के लिए सेट नहीं करना चाहता। इस प्रकार मैंने इसे कोड में डाल दिया

@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {

  static {
    System.setProperty("spring.config.location", "classpath:test.properties");
  }

}

जो दुर्भाग्य से फिर से सफल नहीं था।

application.propertiesJUnit परीक्षणों में सेटिंग्स को ओवरराइड करने के तरीके पर एक सरल समाधान test.propertiesहोना चाहिए कि मैंने इसे अनदेखा किया होगा।


यदि आपको बस कुछ गुणों को कॉन्फ़िगर करने की आवश्यकता है, तो आप नए @DynamicPropertySource एनोटेशन का उपयोग कर सकते हैं। stackoverflow.com/a/60941845/8650621
फेलिप डेसिडारिटी

जवाबों:


293

आप @TestPropertySourceमानों को ओवरराइड करने के लिए उपयोग कर सकते हैं application.properties। इसके जावदोक से:

परीक्षण संपत्ति स्रोतों का उपयोग सिस्टम और अनुप्रयोग संपत्ति स्रोतों में परिभाषित गुण को ओवरराइड करने के लिए किया जा सकता है

उदाहरण के लिए:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {

}

2
बस। धन्यवाद। उदाहरण के तौर पर यह काम नहीं करता है जब ExampleApplication.class पर उपयोग किया जाता है इसलिए मुझे इसे प्रत्येक परीक्षण वर्ग पर सेट करना होगा। क्या वह सही है?
FrVaBe

1
इसे टेस्ट क्लास की पदानुक्रम में कहीं जाना होता है, यानी आप इसे कई अलग-अलग टेस्ट कक्षाओं में कॉन्फ़िगर करने के लिए एक सामान्य सुपरक्लास का उपयोग कर सकते हैं।
एंडी विल्किंसन

64
यह भी ध्यान दें कि कुछ संपत्ति इनलाइन को अधिलेखित करने के लिए @TestPropertySourceएक propertiesतर्क को स्वीकार कर सकते हैं, जैसे कि @TestPropertySource(properties = "myConf.myProp=valueInTest"), यह उस स्थिति में उपयोगी है जब आप पूरी तरह से ब्रांड की संपत्ति फ़ाइल नहीं चाहते हैं।
dyng

2
आप एक सरणी में कई फ़ाइलों को निर्दिष्ट कर सकते हैं, और फाइल सिस्टम पर भी फाइलें (लेकिन याद रखें कि वे CI सर्वर पर काम नहीं कर सकते हैं):@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
एडम

8
ध्यान दें, कि @SpringApplicationConfigurationपहले से ही पदावनत है, और आप का उपयोग करना चाहिए@SpringBootTest
mrkernelpanic

74

स्प्रिंग बूट स्वचालित रूप से लोड होता है src/test/resources/application.properties, यदि निम्न एनोटेशन का उपयोग किया जाता है

@RunWith(SpringRunner.class)
@SpringBootTest

इसलिए, ऑटो कॉन्फ़िगरेशन का उपयोग test.propertiesकरने के application.propertiesलिए नाम बदलें ।

यदि आपको * केवल * गुण फ़ाइल (पर्यावरण में) लोड करने की आवश्यकता है, तो आप निम्नलिखित का उपयोग भी कर सकते हैं, जैसा कि यहां बताया गया है

@RunWith(SpringRunner.class)
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) 

[ अद्यतन: परीक्षण के लिए कुछ गुणों पर काबू पाने ]

  1. जोड़ें src/main/resources/application-test.properties
  2. एनोटेट टेस्ट क्लास के साथ @ActiveProfiles("test")

यह परीक्षण मामले के लिए आवेदन के संदर्भ में लोड application.propertiesऔर फिर यहांapplication-test.properties परिभाषित नियमों के अनुसार होता है

डेमो - https://github.com/mohnish82/so-spring-boot-testprops


1
यकीन नहीं होता है कि यह application.propertiesक्लासपैथ (एक में src/main/resourcesऔर एक में src/test/resources) पर दो फ़ाइलों के लिए एक अच्छा विचार है । कौन गारंटी देता है कि दोनों को लिया जाएगा और कौन सा पहले लिया जाएगा?
FrVaBe

3
@FrVaBe स्प्रिंग इसकी गारंटी देने जा रही है! मुख्य प्रोफ़ाइल गुण हमेशा लोड होते हैं। फिर परीक्षण चरण के दौरान, परीक्षण गुणों को लोड किया जाता है, नए / मौजूदा गुणों को जोड़ / ओवरराइड किया जाता है। यदि आप एक ही नाम के साथ दो फाइलें रखना पसंद नहीं करते हैं, तो आप परीक्षण मामले में सक्रिय प्रोफ़ाइल के रूप application-test.propertiesमें जोड़ सकते हैं src/main/resourcesऔर निर्दिष्ट कर सकते हैं test
मोहनीश

7
वसंत कोई गारंटी नहीं देता है। निर्माण उपकरण परीक्षणों के दौरान मुख्य संसाधनों के पक्ष में परीक्षण संसाधनों का उपयोग करेगा। लेकिन एक परीक्षण application.properties के मामले में मुख्य application.properties को नजरअंदाज कर दिया जाएगा। यह वह नहीं है जो मैं चाहता हूं क्योंकि मुख्य में कई उपयोगी डिफ़ॉल्ट मान शामिल हैं और मुझे केवल परीक्षण के दौरान उनमें से कुछ को ओवरराइड करने की आवश्यकता है (और मैं परीक्षण अनुभाग में पूरी फ़ाइल की नकल नहीं करना चाहता)। देखें यहाँ
FrVaBe

6
आप सही हैं, केवल परिभाषित गुण src/test/resources/application.propertiesपरीक्षण चरण के दौरान लोड किए गए हैं, src/main/resources/application.propertiesपर ध्यान नहीं दिया गया है।
मोहनीश

11
यदि आप अभी तक प्रोफाइल का उपयोग नहीं करते हैं, तो आपको एक समर्पित "परीक्षण" प्रोफ़ाइल की आवश्यकता नहीं है। बस अपने परीक्षण गुणों को नाम दें application-default.propertiesऔर उन्हें माना जाएगा क्योंकि आप स्वचालित रूप से "डिफ़ॉल्ट" प्रोफ़ाइल चला रहे हैं (यदि कोई अन्य घोषित नहीं किया गया है)।
FrVaBe

65

कॉन्फ़िगरेशन को बाहरी करने के लिए आप मेटा-एनोटेशन का भी उपयोग कर सकते हैं । उदाहरण के लिए:

@RunWith(SpringJUnit4ClassRunner.class)
@DefaultTestAnnotations
public class ExampleApplicationTests { 
   ...
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public @interface DefaultTestAnnotations { }

21

यदि आप @SpringBootTestएनोटेशन का उपयोग कर रहे हैं, तो आपके परीक्षण में कुछ गुणों को ओवरराइड करने के लिए उपयुक्त एक और दृष्टिकोण :

@SpringBootTest(properties = {"propA=valueA", "propB=valueB"})

1
SpringBootTestअनुप्रयोग को लोड करता है ।
तुआर्गोबोएलो

8

TLDR:

तो मैंने जो किया वह मानक था src/main/resources/application.propertiesऔर src/test/resources/application-default.propertiesजहाँ मैं अपने सभी परीक्षणों के लिए कुछ सेटिंग्स को ओवरराइड करता था।

पूरी कहानी

मैं उसी समस्या में भाग गया और अब तक प्रोफाइल का उपयोग नहीं कर रहा था। अब ऐसा करना परेशान करने वाला लग रहा था और प्रोफ़ाइल की घोषणा करना याद था - जिसे आसानी से भुलाया जा सकता है।

चाल है, का लाभ उठाने के लिए कि एक प्रोफ़ाइल application-<profile>.propertiesसामान्य प्रोफ़ाइल में सेटिंग्स ओवरराइड करती है। Https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties देखें ।


3

सरल स्पष्टीकरण:

तुम मुझे पसंद कर रहे हैं और आप एक ही है, तो application.propertiesमें src/main/resourcesऔर src/test/resources, और आप कर रहे हैं सोच क्यों application.propertiesअपने परीक्षण फ़ोल्डर में नहीं है अधिभावीapplication.properties आपका मुख्य संसाधनों में, पर पढ़ें ...

यदि आपके पास application.propertiesतहत src/main/resourcesऔर एक ही application.propertiesअधीन src/test/resourcesहै, जो application.propertiesउठाया जाता है, कैसे आप अपने परीक्षण चल रहे हैं पर निर्भर करता है । फ़ोल्डर संरचना src/main/resources और src/test/resources, आप की तरह अपने परीक्षण चलाने यदि ऐसा है तो एक Maven वास्तु सम्मेलन है, mvnw testया यहाँ तक कि gradlew test, application.propertiesमें src/test/resourcesउठाया जाएगा, के रूप में परीक्षण classpath पूर्व में होना होगा मुख्य classpath। लेकिन, आप की तरह अपने परीक्षण चलाने यदि Run as JUnit TestElipse / एसटीएस में, application.propertiesमें src/main/resourcesउठाया जाएगा, के रूप में मुख्य classpath पछाड़ परीक्षण classpath।

आप इसे खोलकर देख सकते हैं Run > Run Configurations > JUnit > *your_run_configuration* > Click on "Show Command Line"

आप कुछ इस तरह देखेंगे:

XXXbin \ javaw.exe -ea -Dfile.encoding = UTF-8 -classpath XXX \ वर्कस्पेस-स्प्रिंग-टूल-सूट-4-4.5.1। XXX \ कार्यक्षेत्र वसंत-उपकरण-सूट-4-4.5.1.RELEASE \ PROJECT_NAME \ बिन \ परीक्षण;

क्या आप देखते हैं कि \ main पहले आता है, और फिर \ test ? ठीक है, यह सब classpath :-) के बारे में है

चियर्स


1
I just configured min as the following :

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console


# changing the name of my data base for testing
spring.datasource.url= jdbc:h2:mem:mockedDB
spring.datasource.username=sa
spring.datasource.password=sa



# in testing i don`t need to know the port

#Feature that determines what happens when no accessors are found for a type
#(and there are no annotations to indicate it is meant to be serialized).
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false`enter code here`

1

यदि आप स्प्रिंग 5.2.5 और स्प्रिंग बूट 2.2.6 का उपयोग कर रहे हैं और पूरी फ़ाइल के बजाय बस कुछ गुणों को ओवरराइड करना चाहते हैं। आप नए एनोटेशन का उपयोग कर सकते हैं: @DynamicPropertySource

@SpringBootTest
@Testcontainers
class ExampleIntegrationTests {

    @Container
    static Neo4jContainer<?> neo4j = new Neo4jContainer<>();

    @DynamicPropertySource
    static void neo4jProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.data.neo4j.uri", neo4j::getBoltUrl);
    }
}

0

अन्यथा हम डिफ़ॉल्ट संपत्ति विन्यासकर्ता का नाम बदल सकते हैं, संपत्ति की स्थापना कर सकते हैं spring.config.name=testऔर फिर वर्ग-पथ संसाधन होने के कारण src/test/test.propertiesहमारे org.springframework.boot.SpringApplicationअलग-अलग उदाहरण इस अलग परीक्षण से स्वत: कॉन्फ़िगर हो जाएंगे। लाभ, आवेदन गुणों की अनदेखी;

लाभ: परीक्षणों का ऑटो-कॉन्फ़िगरेशन;

ड्राबैक: CI लेयर पर "spring.config.name" प्रॉपर्टी को उजागर करना

रेफरी: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.config.name = अनुप्रयोग # फ़ाइल नाम कॉन्फ़िगर करें


5
अनदेखी करना application.propertiesमेरे लिए कोई विकल्प नहीं है क्योंकि मैं केवल परीक्षण में कुछ मूल कॉन्फ़िगरेशन मानों को ओवरराइड करना चाहता हूं ।
FrVaBe

मैं एक ही परीक्षा है कि src / main / Resources / application.properties को लोड नहीं करता है और यह है के लिए एक रास्ता खोज रहा है। एक फ़ाइल बनाएँ: src / test / Resources / vac.properties और परीक्षण में एनोटेशन जोड़ें जो मुख्य गुणों को अनदेखा करना चाहिए। @TestPropertySource (गुण = "spring.config.name = खाली")
rvertigo

प्रत्येक कनिष्ठ परीक्षण विधि के लिए एक विशिष्ट संपत्ति मान कैसे सेट करें?
निकोलस

0

आप src / test / Resources में एक application.properties फ़ाइल भी बना सकते हैं जहाँ आपके JUnits लिखे गए हैं।


यह कैसे मदद करता है? ^ ^
जंपिंग_मोनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.