2010-05-18 13 views
17

के खिलाफ डीएओ परीक्षण के वसंत/हाइबरनेट/जूनिट उदाहरण मैं डीएओ की कार्यक्षमता की जांच के लिए जुनीट परीक्षण को लागू करने की कोशिश करने पर काम कर रहा हूं। (डीएओ मूल वस्तु/तालिका संबंध बनायेगा/पढ़ेगा)।एचएसक्यूएलडीबी

मुसीबत मैं आ रही डीएओ के हठ (गैर-परीक्षण कोड के लिए) एक आंतरिक समाधान वसंत का उपयोग कर के माध्यम से पूरा किया जा रहा है/हाइबरनेट है, जो हमेशा की तरह *.hbm.xml टेम्पलेट्स है कि ज्यादातर उदाहरण मैं समाप्त पाए गए हैं।

इस वजह से

, मैं कुछ कैसे एक में स्मृति HSQLDB करने के लिए सेटअप/पढ़ने (बस बहुत ही बुनियादी कार्यक्षमता) बनाने के लिए डीएओ लागू करने के लिए एक JUnit परीक्षण करने के लिए समझने में कोई परेशानी हो रही है। मुझे कुछ उदाहरण मिल गए हैं, लेकिन इन-हाउस दृढ़ता का उपयोग करने का अर्थ है कि मैं उदाहरणों के कुछ वर्गों को विस्तारित नहीं कर सकता (मुझे एप्लिकेशन-context.xml सेटअप ठीक से प्रतीत नहीं होता है)।

क्या कोई भी इस परियोजना कार्यक्षमता को लागू करने के सर्वोत्तम तरीके की मेरी समझ को आगे बढ़ाने के लिए किसी भी परियोजना/उदाहरणों को देख सकता है (या कोई दस्तावेज़ीकरण)? मुझे लगता है कि यह वास्तव में सरल होना चाहिए, लेकिन मैं जो उदाहरण मिला है उसे लागू करने में समस्याएं चल रहा हूं।

संपादित करें:

यहाँ किसी को जो एक हाथ बातें जा रहा हो रही की जरूरत के लिए बेहतर पठनीयता के लिए मेरे समाधान है,:

  • मेरे TestClass:

    @RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration(locations = "classpath:applicationContextTest-Example.xml") 
    @Transactional 
    public class ExampleDaoTest extends AbstractTransactionalJUnit4SpringContextTests { 
        @Resource(name = "sessionFactory") 
        private SessionFactory exampleSessionFactory; 
    
        @Resource(name = "exampleDao") 
        private ExampleDao exampleDao; 
    
  • मेरे applicationContext.xml फ़ाइल :

    <!-- List of Daos to be tested --> 
    <bean id="exampleDao" class="org.myExample.ExampleDao"/> 
    
    <!-- Datasource --> 
    <bean id="example_dataSource" 
         class="org.apache.commons.dbcp.BasicDataSource"> 
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> 
        <property name="url" value="jdbc:hsqldb:mem:ExampleTest"/> 
        <property name="username" value="sa"/> 
        <property name="password" value=""/> 
    </bean> 
    
    <!-- Session Factory --> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
        <property name="dataSource" ref="example_dataSource"/> 
        <property name="annotatedClasses"> 
         <list> 
          <value>org.myExample.ExampleClass</value> 
         </list> 
        </property> 
        <property name="hibernateProperties"> 
         .... left to user to choose properties 
        </property> 
    </bean> 
    
+0

कुछ अतिरिक्त जानकारी: मैं भी configur के साथ अनुभव नहीं कर रहा हूँ स्प्रिंग/हाइबरनेट के आयन, मैंने उन्हें पहले से ही पिछली परियोजनाओं में पहले ही कॉन्फ़िगर किया है। मेरे वर्तमान परियोजना, विन्यास की एक उलझन है मैं समझ नहीं कितना "घर में" वर्ग मैं अपने सत्र कारखाने प्राप्त करने के लिए भेजा। सभी DAOs यह (एक अमूर्त वर्ग) का विस्तार, और भीतर एक सार घोषणा है: सार्वजनिक सार SessionFactory getSessionFactory(); मैं यह नहीं समझ सकता कि "getSessionFactory()" विधि कहां से आती है। मुझे लगता है कि इसे किसी भी तरह वसंत द्वारा इंजेक्शन दिया जाना चाहिए, लेकिन मुझे ऐसा करने वाली कोई कॉन्फ़िगरेशन फाइल नहीं मिल रही है। –

+0

धन्यवाद दोस्तों, आप सब मददगार रहे हैं। भविष्य में उन लोगों के लिए: मैं अपने इकाई परीक्षण में शामिल (@ContextConfiguration के माध्यम से के रूप में विली निर्दिष्ट करता है) मेरी applicationContext-Test.xml फ़ाइल जिसमें मैं एक HSQLDB डेटा स्रोत, सत्र कारखाने, लेन-देन प्रबंधक, और Daos सेम के रूप में परिभाषित <सेम आईडी = "myDao" वर्ग = "org.mine.MyDao" />। मेरी टेस्ट क्लास के साथ एनोटेटेड है: @RunWith (SpringJUnit4ClassRunner.class), @Context कॉन्फ़िगरेशन (स्थान = "आपका ऐपकॉन्टेक्स्ट.एक्सएमएल") @ ट्रांसेक्शनल, और मेरे सत्र फैक्ट्री और दाओ संसाधनों (.xml defs से) के रूप में एनोटेटेड हैं: @ संसाधन (नाम = "sessionFactory") –

उत्तर

5

स्प्रिंग 3 एक नया jdbc नामस्थान प्रदान करता है जिसमें एचएसक्यूएलडीबी सहित एम्बेडेड डेटाबेस के लिए समर्थन शामिल है। तो वह उस हिस्से का ख्याल रखता है।

मुझे आश्चर्य है कि "इन-हाउस समाधान" क्या हो सकता है। आप अपने डोमेन ऑब्जेक्ट्स को ओआरएम में एनोटेशन (या तो जेपीए या हाइबरनेट एनोटेशन) का उपयोग कर सकते हैं, तो आपको "इन-हाउस सॉल्यूशन" की आवश्यकता क्यों है? जैसे:

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
    p:dataSource-ref="dataSource" 
    p:packagesToScan="myapp.model" /> 

जहां तक ​​परीक्षण लागू करने के लिए, स्प्रिंग के टेस्टकॉन्टेक्स्ट फ्रेमवर्क का उपयोग करें। एक परीक्षण इस तरह दिख सकता है (फिर से मैं, नीचे स्प्रिंग 3 संभालने कर रहा हूँ, हालांकि यह @Autowired को वसंत 2.5 में काम करना चाहिए बस @Inject बदलकर):

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({ 
    "/beans-datasource-it.xml", 
    "/beans-dao.xml", 
    "/beans-service.xml", 
    "/beans-web.xml" }) 
@Transactional 
public class ContactControllerIT { 
    @Inject private ContactController controller; 

    ... setUp() and tearDown() ... 

    @Test 
    public void testGetContact() { 
     String viewName = controller.getContact(request, 1L, model); 

     ... assertions ... 
    } 
} 

आप beans-datasource-it.xml अंदर एम्बेडेड डेटाबेस डाल चाहते हैं, उदाहरण के लिए। ('यह' यहाँ एकीकरण परीक्षण के लिए खड़ा है, और फ़ाइलों classpath पर हैं।) इस उदाहरण में नियंत्रक beans-web.xml में रहता है, और ContactController क्षेत्र में autowired कर दिया जाएगा।

बस क्या करना है की एक रूपरेखा है, लेकिन उम्मीद है कि यह आप आरंभ करने के लिए काफी है कि।

1

हाइबरनेट साथ लब्बोलुआब यह SessionFactory है - अपने घर में समाधान सबसे अधिक संभावना है इनमें से किसी एक को किसी भी तरह का निर्माण किया जाएगा। अपने परीक्षण ऐप संदर्भ में एक ही तरीके से बनाने के लिए एक बीन जोड़ें, और फिर रनटाइम पर उपयोग किए जाने वाले अपने इन-हाउस कोड का उपयोग करके यदि संभव हो।)। तत्काल करने के लिए आपको अपना खुद का FactoryBean बनाना होगा। बजाय का उपयोग कर LocalsessionFactoryBean, अपने कस्टम कारखाने सेम का उपयोग की - (। अपने आधार वर्ग के रूप में AbstractFactoryBean का प्रयोग करें)

एक बार इस जगह में है, LocalSessionFactoryBean का उपयोग कर उदाहरण के सबसे अपनी स्थिति के लिए चले जा सकता है।

(आप पहले से ऐसा नहीं किया है, तो वसंत संदर्भ में Testing अनुभाग को देखो -। यह वसंत के साथ परीक्षण बनाता है, और संदर्भ से सेम के साथ एक हवा परीक्षण इंजेक्शन)

2

See here। यह maven2 को निर्माण उपकरण के रूप में मानता है, लेकिन आप आसानी से कुछ भी उपयोग कर सकते हैं।

+0

@downvoter - क्योंकि मैं अपने ब्लॉग से जुड़ा हुआ था? – Bozho

2

मैं हाल ही में मेरे कोड हाइबरनेट, स्प्रिंग और HSQLDB उपयोग करने के कुछ में एक ऐसी ही समाधान लागू किया है।

इसका यह देखते हुए कि अब AbstractTransactionalJUnit4SpringContextTests बहिष्कृत कर दिया गया है लायक है - लेकिन यह अभी भी बहुत सीधे आगे परीक्षण करने के लिए है - मैं यहाँ सबसे विवरण को कवर: http://automateddeveloper.blogspot.com/2011/05/hibernate-spring-testing-dao-layer-with.html

0

मेरा आवेदन संदर्भ कुछ अलग दिखाई देता

<beans:bean class="org.apache.commons.dbcp.BasicDataSource" id="HSQL_DS"> 
    <beans:property name="driverClassName" value="org.hsqldb.jdbcDriver"/> 
    <beans:property name="url" value="jdbc:hsqldb:mem:Test"/> 
    <beans:property name="username" value="sa"/> 
    <beans:property name="password" value=""/> 
</beans:bean> 
<jdbc:embedded-database id="HSQL_DS"> 
    <jdbc:script location="classpath:schema.sql"/> 
    <jdbc:script location="classpath:data.sql"/> 
</jdbc:embedded-database> 

और अपने परीक्षण वर्ग इस तरह दिखता है:

public class Tester { 

    private EmbeddedDatabase db; 

    @Before 
    public void setUp(){ 
     db = new EmbeddedDatabaseBuilder().addDefaultScripts().build(); 


    } 

    @Test 
    public void TestMe(){ 
     System.out.println("Testing"); 
    } 


    @After 
    public void tearDown(){ 

     db.shutdown(); 
    } 
} 
संबंधित मुद्दे