2010-01-06 6 views
39

एकीकरण परीक्षणों के लिए आपकी स्प्रिंग कॉन्फ़िगरेशन embedded h2 datasource और वैकल्पिक रूप से, जुनीट का उपयोग करने जैसा दिखता है?परीक्षण के लिए एम्बेडेड एच 2 डेटाबेस के लिए स्प्रिंग कॉन्फ़िगरेशन

मेरी पहली कोशिश SingleConnectionDataSource के साथ मूल रूप से काम करती है, लेकिन अधिक जटिल परीक्षणों में विफल रही जहां आपको एक ही समय में या निलंबित लेनदेन में कई कनेक्शन की आवश्यकता होती है। मुझे लगता है कि tcp based server mode में एच 2 भी काम कर सकता है, लेकिन शायद यह स्मृति में एक अस्थायी एम्बेडेड डेटाबेस के लिए सबसे तेज़ संचार मोड नहीं है।

संभावनाएं और उनके फायदे/नुकसान क्या हैं? साथ ही, आप टेबल कैसे बनाते हैं/डेटाबेस को पॉप्युलेट करते हैं?


अपडेट: चलिए कुछ ठोस आवश्यकताओं को निर्दिष्ट करते हैं जो ऐसे परीक्षणों के लिए महत्वपूर्ण हैं।

  • डेटाबेस अस्थायी होना चाहिए और स्मृति में
  • कनेक्शन शायद टीसीपी उपयोग नहीं करना चाहिए, गति आवश्यकताओं के लिए
  • यह अच्छा होगा यदि मैं दौरान डेटाबेस की सामग्री का निरीक्षण करने के लिए एक डेटाबेस उपकरण इस्तेमाल कर सकते हैं हो सकता है डिबगिंग
  • हम के बाद से हम इकाई में आवेदन सर्वर डेटा स्रोत का उपयोग नहीं कर सकते हैं एक डेटा स्रोत को परिभाषित करने के लिए है परीक्षण

उत्तर

45
आरक्षण है कि मैं अगर कोई उपकरण है जो डेटाबेस का निरीक्षण कर सकते है पता नहीं है के साथ

, मुझे लगता है कि एक सरल उपाय स्प्रिंग एम्बेडेड डेटाबेस का उपयोग किया जाएगा (3.1.x docs, current docs) जो समर्थन करता है HSQL, H2, और डर्बी ।

<jdbc:embedded-database id="dataSource" type="H2"> 
    <jdbc:script location="classpath:db-schema.sql"/> 
    <jdbc:script location="classpath:db-test-data.sql"/> 
</jdbc:embedded-database> 

आप जावा आधारित विन्यास चाहें, तो आप एक DataSource इस तरह का दृष्टांत (ध्यान दें कि EmbeddedDataBase फैली DataSource) कर सकते हैं::

@Bean(destroyMethod = "shutdown") 
public EmbeddedDatabase dataSource() { 
    return new EmbeddedDatabaseBuilder(). 
      setType(EmbeddedDatabaseType.H2). 
      addScript("db-schema.sql"). 
      addScript("db-test-data.sql"). 
      build(); 
} 

एच 2 का उपयोग करना, अपने xml विन्यास निम्नलिखित प्रकार दिखाई देगा

डेटाबेस तालिका db-schema.sql स्क्रिप्ट द्वारा बनाई गई हैं और वे डीबी-परीक्षण से परीक्षण डेटा के साथ आबादी में हैं -data.sql स्क्रिप्ट।

अपने क्लासपाथ में H2 डेटाबेस ड्राइवर जोड़ने के लिए मत भूलना।

+0

जोड़ा, यदि हाइबरनेट (एचबीएम 2ddl) में मॉडलों से स्वत: डीडीएल पीढ़ी के लिए कॉन्फ़िगर किया गया डेटाबेस, स्क्रिप्ट डेटा संरचना निर्माण से पहले हाइबरनेट के माध्यम से चलती है। Hbm2ddl के बाद इन स्क्रिप्ट को निष्पादित करने के लिए कोई समाधान है? –

0

मुझे लगता है कि अपने उत्पादन डेटा स्रोत कार्यान्वयन उपयोग करने के लिए सबसे अच्छा है (केवल वाई यूनिट-टेस्ट के लिए वें अलग-अलग कनेक्शन-स्ट्रिंग)।

वैसे भी "अधिक जटिल परीक्षणों में विफल" अधिक विस्तृत उत्तर के लिए पर्याप्त जानकारी नहीं देता है।

(स्व विज्ञापन: check this)

+5

इकाई परीक्षण के लिए उत्पादन डेटाबेस? यदि आप वास्तव में उदाहरण का उपयोग करते हैं उदाहरण के दौरान स्वचालित परीक्षणों के लिए एक ऑरैकल डेटाबेस एक मेवेन बिल्ड आप आसानी से परेशानी में भाग सकते हैं। यह काफी धीमा है, वहां मौजूद डेटा पर निर्भर करता है और किसी और को एक ही समय में निर्माण नहीं करना चाहिए। 8-) मैं ओरेकल मोड में एच 2 पसंद करता हूं। बीटीडब्लू: यह प्रश्न उपलब्ध संभावनाओं के बारे में सामान्य है, मेरी विशिष्ट समस्या के बारे में कम। –

+0

नहीं, उत्पादन डेटासोर्स कार्यान्वयन। कनेक्शन स्ट्रिंग में केवल अंतर के साथ – Bozho

+0

आह, ठीक है, लेकिन यह एक अनुप्रयोग सर्वर में एक डेटास्रोत होगा। तो यह संभव नहीं है। –

18

मैं वर्तमान में एक डेटा स्रोत के रूप में एक ही परीक्षण springconfig-फ़ाइल में शामिल हैं:

<bean id="database.dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy"> 
    <constructor-arg> 
     <bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> 
      <property name="driverClass" value="org.h2.Driver" /> 
      <property name="url" 
       value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2" /> 
     </bean> 
    </constructor-arg> 
</bean> 

<!-- provides a H2 console to look into the db if necessary --> 
<bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server" 
    factory-method="createWebServer" depends-on="database.dataSource" 
    init-method="start" lazy-init="false"> 
    <constructor-arg value="-web,-webPort,11111" /> 
</bean> 

बनाना/तालिकाओं executeSqlScript का उपयोग करके किया जा सकता है छोड़ने जब अधिभावी AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction, या उचित स्थान पर SimpleJdbcTestUtils.executeSqlScript के साथ।

this posting की तुलना करें।

+0

"मुझे JUnit4 परीक्षणों के साथ executeSqlScript के लिए प्रतिस्थापन नहीं मिला" org.springframework.test.context.junit4 को विस्तारित करने का प्रयास करें .AbstractTransactionalJUnit4SpringContextTests –

+0

इस उत्तर के लिए धन्यवाद। मेरा यूनिट परीक्षण एमएम डीबी में विफल रहा जब तक कि मैंने डीबी_CLOSE_DELAY –

8

एच 2 अंतर्निहित कनेक्शन पूल कार्यान्वयन के साथ बंडल किया गया है।

<bean id="dataSource" class="org.h2.jdbcx.JdbcConnectionPool" destroy-method="dispose"> 
    <constructor-arg> 
     <bean class="org.h2.jdbcx.JdbcDataSource"> 
      <property name="URL" value="jdbc:h2:dbname"/> 
      <property name="user" value="user"/> 
      <property name="password" value="password"/> 
     </bean> 
    </constructor-arg> 
</bean> 

डेटाबेस एक निपटाने विधि बुला जब वसंत आवेदन संदर्भ बंद कर देता है द्वारा बंद कर दिए जाएंगे: निम्न XML एक आवश्यकता के बिना एक डेटा स्रोत सेम के रूप में उपयोग DBCP या C3P0 पर अतिरिक्त निर्भरता को पेश करने का एक उदाहरण प्रदान करता है।

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