2011-04-14 24 views
17

मान लीजिए कि मेरे मार्ग अलग-अलग रूटबिल्डर वर्ग में बनाए गए हैं। ऐसा लगता है कि: JMS कतार सेअपाचे कैमल में यूनिट परीक्षण उत्पादन मार्ग कैसे करें?

  • हड़पने संदेश
  • कुछ परिवर्तन करते हैं, मान्यता आदि
  • मान्यता के आधार पर विशिष्ट JMS कतार के लिए तत्पर परिणाम और डीबी
  • में कुछ बचाने

मैं था यूनिट की तरह इस रूट का परीक्षण किसी भी जेएमएस ब्रोकर और कोई डीबी नहीं है। मुझे पता है कि मैं अपने प्रोसेसर कार्यान्वयन का मज़ाक उड़ा सकता हूं लेकिन यह पर्याप्त नहीं है। मैं इस मार्ग को बदलना नहीं चाहता (मान लीजिए कि मुझे उस वर्ग को जार फ़ाइल में मिला है)। जहां तक ​​मुझे कैमल इन एक्शन (सेकेंड 6.2.6) से पता है, एंडपॉइंट्स और अन्य सामानों के मैक्स का उपयोग करने में सक्षम होने के लिए मुझे अपनी रूट एंडपॉइंट परिभाषाओं को बदलने की ज़रूरत है (पुस्तक के उदाहरण में यह "मीना: टीसीपी:// मिरांडा "से" नकली: मिरांडा "आदि)।

क्या मार्ग परिभाषाओं को बदलने के बिना पूर्ण अलगाव में प्रवाह का परीक्षण करना संभव है? यदि मुझे अपना रूटबिल्डर एक अलग वर्ग के रूप में मिला, तो क्या मुझे किसी भी तरह से "प्रतिलिपि" मार्ग परिभाषा के लिए मजबूर होना पड़ा और इसे मैन्युअल रूप से बदलना पड़ा? क्या यह गलत बात का परीक्षण नहीं कर रहा है?

मैं ऊंट के लिए काफी नया हूं और मेरे लिए यह वास्तव में अच्छा होगा कि मार्गों को हटाने के दौरान पृथक इकाई परीक्षण हो सके। बस कुछ बदलने में सक्षम होने के लिए, छोटे परीक्षण चलाएं, परिणाम देखें और इसी तरह।

उत्तर

23

रूटबिल्डर वर्ग का मानना ​​है कि अंतराल को हार्डकोड किया गया है, फिर परीक्षण के लिए यह थोड़ा मुश्किल है। हालांकि अगर रूटबिल्डर एंडपॉइंट यूरिस के लिए प्रॉपर्टी प्लेसहोल्डर का उपयोग कर रहा है, तो आप अक्सर यूनिट परीक्षणों के लिए एंडपॉइंट यूरिस के एक अलग सेट का उपयोग करने में सक्षम होंगे। जैसा कि ऊंट पुस्तक के अध्याय 6 में बताया गया है।

जैसा कि यहाँ दिखाया वे hardcoded रहे हैं तो आप अपनी इकाई परीक्षण में सुविधा के साथ सलाह का उपयोग कर सकते हैं: http://camel.apache.org/advicewith.html

कैमल 2.7 में हम यह संभव मार्ग बहुत आसान हेरफेर करने के लिए है, तो आप कुछ हिस्सों को हटा सकते हैं बनाया है, की जगह भागों, इत्यादि बुनाई की चीजें हैं जो वार्तालाप को जोड़ती हैं।

उदाहरण के लिए डेटाबेस एंडपॉइंट पर एक संदेश भेजने का अनुकरण करने के लिए, आप इसे ऊपर का उपयोग कर सकते हैं और दूसरे स्थान पर प्रतिस्थापित कर सकते हैं जहां आप इसे नकली में भेजते हैं।

पूर्व में जारी हुए में आप interceptSendToEndpoint चाल है, जो भी ऊंट पुस्तक में कवर किया जाता है (खंड 6.3.3) का उपयोग कर सकते

ओह तुम भी नकली घटक के साथ घटकों की जगह ले सकता के रूप में कैमल में पेज 169 पर दिखाया अब 2.8 आगे नकली घटक अब यूरी पैरामीटर के बारे में शिकायत नहीं करेगा जो इसे नहीं जानता है। इसका मतलब प्रति घटक स्तर पर घटकों के साथ घटकों को प्रतिस्थापित करना बहुत आसान है।

3

मैं अपने वसंत फ़ाइल में और फिर परीक्षण वर्ग पथ मैं एक stock.out = xxxx जो रनटाइम पर बदला जाता है पर shop.properties में मैं अलग-अलग मार्गों से एक के लिए हो सकता है तो

<bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent"> 
     <property name="location" value="classpath:shop.properties"/> 
    </bean> 

    <route> 
     <from uri="direct://stock"/> 
     <to uri="{{stock.out}}"/> 
    </route> 

है रनटाइम के लिए और एक परीक्षण के लिए

6.1 में एक बेहतर उदाहरण है।एकाधिक वातावरण

0

में 6 इकाई परीक्षण आप प्रति क्लॉस इब्सन के जवाब के रूप में अंतिम बिंदु बाहर स्वैप करने के लिए अवरोध और सलाह का उपयोग कर सकते हैं, मुझे लगता है कि यह इतना है कि अपने परीक्षण 'नहीं कर रहे अपने मार्गों Endpoint उदाहरणों स्वीकार करने के लिए अनुमति देने के लिए कहीं बेहतर है टी आपके उत्पादन एंडपॉइंट यूआरआई के साथ मिलकर।

उदाहरण के लिए, मान लीजिए कि आप एक RouteBuilder तो जैसे अंतिमबिंदुओं सुई की तरह

public class MyRoute extends RouteBuilder { 
    @Override 
    public void configure() throws Exception { 
     from("http://someapi/someresource") 
     .process(exchange -> { 
      // Do stuff with exchange 
     }) 
     .to("activemq:somequeue"); 
    } 
} 

कुछ आप के लिए यह संभव बना सकते हैं लग रहा है कि है:

public class MyRoute extends RouteBuilder { 
    private Endpoint in; 
    private Endpoint out; 

    // This is the constructor your production code can call 
    public MyRoute(CamelContext context) { 
     this.in = context.getEndpoint("http://someapi/someresource"); 
     this.out = context.getEndpoint("activemq:somequeue"); 
    } 

    // This is the constructor your test can call, although it would be fine 
    // to use in production too 
    public MyRoute(Endpoint in, Endpoint out) { 
     this.in = in; 
     this.out = out; 
    } 

    @Override 
    public void configure() throws Exception { 
     from(this.in) 
     .process(exchange -> { 
      // Do stuff with exchange 
     }) 
     .to(this.out); 
    } 
} 

कौन सा तो इस तरह का परीक्षण किया जा सकता है:

public class MyRouteTest { 
    private Endpoint in; 
    private MockEndpoint out; 
    private ProducerTemplate producer; 

    @Before 
    public void setup() { 
     CamelContext context = new DefaultCamelContext(); 

     this.in = context.getEndpoint("direct:in"); 
     this.out = context.getEndpoint("mock:direct:out", MockEndpoint.class); 
     this.producer = context.createProducerTemplate(); 
     this.producer.setDefaultEndpoint(this.in); 

     RouteBuilder myRoute = new MyRoute(this.in, this.out); 
     context.addRoutes(myRoute); 

     context.start(); 
    } 

    @Test 
    public void test() throws Exception { 
     this.producer.sendBody("Hello, world!"); 
     this.out.expectedMessageCount(1); 
     this.out.assertIsSatisfied(); 
    } 
} 

इसमें निम्नलिखित फायदे हैं:

  • अपने परीक्षण बहुत ही सरल और समझने में आसान है, और यहां तक ​​कि CamelTestSupport या अन्य सहायक वर्गों
  • CamelContext हाथ से बनाई गई है, ताकि आप सुनिश्चित करें कि केवल परीक्षण के अंतर्गत मार्ग है हो सकता है विस्तार करने के लिए की जरूरत नहीं है बनाया
  • परीक्षण उत्पादन मार्ग यूआरआई के बारे में परवाह नहीं करता
  • आप अभी भी है की सुविधा के मार्ग वर्ग में हार्ड-कोड endpoint यूआरआई अगर आप चाहते हैं