@Test

2016-08-19 10 views
12

हर वसंत बूट पर एक भी @Configuration वर्ग ओवरराइड मेरी वसंत बूट आवेदन पर मैं अपने @Configuration वर्गों में से एक के लिए एक परीक्षण विन्यास के साथ ओवरराइड करना चाहते (विशेष रूप से मेरी @EnableAuthorizationServer@Configuration वर्ग), मेरे परीक्षण के सभी पर।@Test

अब तक spring boot testing features और spring integration testing features का अवलोकन कोई सीधा समाधान सामने आया है के बाद:

  • @TestConfiguration: यह विस्तार नहीं ओवरराइड करने के लिए है,
  • @ContextConfiguration(classes=…​) और @SpringApplicationConfiguration(classes =…​) मुझे पूरी कक्षा को ओवरराइड करने देता है, केवल एक वर्ग नहीं;
  • @Test के अंदर एक आंतरिक @Configuration कक्षा डिफ़ॉल्ट कॉन्फ़िगरेशन को ओवरराइड करने का सुझाव दिया गया है, लेकिन कोई उदाहरण प्रदान नहीं किया गया है;

कोई सुझाव?

उत्तर

15

इनर परीक्षण विन्यास

अपने परीक्षण के लिए एक आंतरिक @Configuration का उदाहरण:

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class SomeTest { 

    @Configuration 
    static class ContextConfiguration { 
     @Bean 
     @Primary //may omit this if this is the only SomeBean defined/visible 
     public SomeBean someBean() { 
      return new SomeBean(); 
     } 
    } 

    @Autowired 
    private SomeBean someBean; 

    @Test 
    public void testMethod() { 
     // test 
    } 
} 

श्रेणी स्तर एनोटेशन @RunWith(SpringRunner.class) और @SpringBootTest स्प्रिंग बूट के लिए 1.4 + रहे हैं, लेकिन एक आंतरिक का उदाहरण @ कॉन्फिगरेशन @RunWith(SpringJUnit4ClassRunner.class) और @SpringApplicationConfiguration या @ContextConfiguration का उपयोग कर पुराने संस्करणों के लिए भी मान्य रहता है।

@Primary

सेम परिभाषा पर @Primary एनोटेशन सुनिश्चित करने के लिए कि यह एक प्राथमिकता दी जाएगी यदि एक से अधिक पाए जाते हैं।

पुन: प्रयोज्य परीक्षण विन्यास

आप कई परीक्षण के लिए टेस्ट विन्यास का पुन: उपयोग करना चाहते हैं, तो आप एक स्प्रिंग प्रोफ़ाइल @Profile("test") साथ एक स्टैंडअलोन विन्यास वर्ग को परिभाषित कर सकते हैं। फिर, अपनी टेस्ट क्लास प्रोफाइल को @ActiveProfiles("test") से सक्रिय करें। पूरा कोड देखें:

@RunWith(SpringRunner.class) 
@SpringBootTests 
@ActiveProfiles("test") 
public class SomeTest { 

    @Autowired 
    private SomeBean someBean; 

    @Test 
    public void testMethod() { 
     // test 
    } 
} 

@Configuration 
@Profile("test") 
public class TestConfiguration { 
    @Bean 
    @Primary //may omit this if this is the only SomeBean defined/visible 
    public SomeBean someBean() { 
     return new SomeBean(); 
    } 
} 
+2

धन्यवाद। मैंने देखा है कि मैं 'src/test/java' पर ओवरराइडिंग '@ सक्षम प्राधिकरण सर्वर' @ कॉन्फ़िगरेशन' कक्षा को छोड़कर सभी परीक्षणों पर कक्षा को ओवरराइड भी कर सकता हूं। स्प्रिंग बूट नियम :-) – NotGaeL

+0

एक sidenote के रूप में, यदि आपको किसी विशेष '@ कॉन्फ़िगरेशन' पर एक मान बदलने की आवश्यकता है, तो इसे ओवरराइड करने के बजाय आप अपने परीक्षणों के लिए एक विशिष्ट वसंत बूट प्रोफ़ाइल (जैसे नाम 'test') सक्षम कर सकते हैं एनोटेशन '@ActiveProfiles ({"test", ...}) का उपयोग करके' अपने टेस्ट क्लास (एसएस) पर। फिर एक सरल 'अगर (Arrays.asList (environment.getActiveProfiles()) में आपके' @ कॉन्फ़िगरेशन 'पर' ("test") शामिल है। – NotGaeL

+1

आपका समाधान विफल रहता है यदि अन्य बीन्स में से एक आंतरिक रूप से उपयोग करता है, तो इसे कुछ बीन वर्ग द्वारा इंजेक्शन दिया जाता है। इसे काम करने के लिए बस स्प्रिंगबूटटेस्ट एनोटेशन द्वारा उपयोग की जाने वाली कक्षाओं की सूची में कॉन्टेक्स्ट कॉन्फ़िगरेशन क्लास जोड़ें। वह है: @SpringBootTest (कक्षाएं = {Application.class, SomeTest.ContextConfiguration.class}) –

3

आप spring boot profiles उपयोग करना चाहिए:

  1. @Profile("test") के साथ अपने परीक्षण विन्यास पर टिप्पणी करें।
  2. @Profile("production") के साथ अपनी उत्पादन कॉन्फ़िगरेशन को एनोटेट करें।
  3. अपनी गुण फ़ाइल में उत्पादन प्रोफ़ाइल सेट करें: spring.profiles.active=production
  4. @Profile("test") के साथ अपनी टेस्ट क्लास में परीक्षण प्रोफ़ाइल सेट करें।

तो जब आपका एप्लिकेशन शुरू होता है तो यह "उत्पादन" वर्ग का उपयोग करेगा और जब परीक्षण सितारों में यह "परीक्षण" वर्ग का उपयोग करेगा।

यदि आप आंतरिक/नेस्टेड @Configuration कक्षा का उपयोग करते हैं तो इसका उपयोग आपके एप्लिकेशन की प्राथमिक कॉन्फ़िगरेशन के बजाय किया जाएगा।

संबंधित मुद्दे