2009-09-30 16 views
6

वसंत के साथ इकाई परीक्षण करने का सबसे अच्छा तरीका क्या है? मुझे लगता है कि परीक्षण टेस्टएनजी & स्प्रिंग 3 के साथ jmockit खराब नहीं है, इसलिए मैं अभी क्या कर रहा हूं, लेकिन अगर मैं अपने ताजा स्प्रिंग प्रोजेक्ट के लिए टूल का चयन कर रहा हूं, तो कृपया मुझे तुरंत बताएं। :-)टेस्टएनजी और वसंत 3

वैसे भी, मैंने एक ऐसी इकाई बनाई है जिसे मैं परीक्षण करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि वसंत संदर्भ से वास्तव में टेस्टएनजी कैसे चलाएं। मैं applicationContext.xml मॉडल और व्यापार परत की स्थापना के लिए सेम आयात करने के साथ एक साधारण परीक्षण वर्ग

package com.mydomain.data.entities.test; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; 
import org.testng.Assert; 
import org.testng.annotations.*; 

@ContextConfiguration(locations={"classpath:applicationContext.xml"}) 
public class SimpleTest extends AbstractTestNGSpringContextTests { 

    @Autowired 
    private ApplicationContext applicationContext; 

    @BeforeClass 
    protected void setUp() throws Exception { 
     Assert.assertNotNull(applicationContext); 
    } 

    @Test 
    public void testNothing() { 

    } 

} 

बना लिया है। सबसे पहले, मैं इसे प्रोजेक्ट/वेब रूट/वेब-आईएनएफ से applicationContext.xml का उपयोग करना चाहता हूं, जबकि इस परीक्षण का स्रोत परियोजना/src/com/mydomain/data/entities/test में रहता है, लेकिन मेरा मानना ​​है कि /applicationContext.xml मुझे क्लासपाथ के समान प्रोजेक्ट/src देगा: क्या यह सही है?

इसके अलावा, अब मैं मॉडल और व्यावसायिक परतों का उपयोग कर रहा हूं जो मेरा वेब एप्लिकेशन उपयोग करेगा, मुझे उम्मीद है कि यह समान व्यवहार करे। लेकिन, जब मैं परीक्षण पर TestNG लॉन्च करते हैं, यह sais:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in URL [file:/Users/niklas/Documents/Eclipse/Project/WebRoot/WEB-INF/Project-Model.xml]: Invocation of init method failed; nested exception is java.lang.IncompatibleClassChangeError: class org.hibernate.cfg.ExtendedMappings has interface org.hibernate.cfg.Mappings as super class 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1393) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:449) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:289) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:286) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:352) 
    at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:266) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.detectPersistenceExceptionTranslators(PersistenceExceptionTranslationInterceptor.java:121) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.<init>(PersistenceExceptionTranslationInterceptor.java:77) 
    at org.springframework.dao.annotation.PersistenceExceptionTranslationAdvisor.<init>(PersistenceExceptionTranslationAdvisor.java:70) 
    at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.setBeanFactory(PersistenceExceptionTranslationPostProcessor.java:99) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1414) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1381) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:511) 
    ... 38 more 
Caused by: java.lang.IncompatibleClassChangeError: class org.hibernate.cfg.ExtendedMappings has interface org.hibernate.cfg.Mappings as super class 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:700) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) 
    at java.net.URLClassLoader.access$000(URLClassLoader.java:56) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:195) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:319) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:330) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:254) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:399) 
    at org.hibernate.cfg.AnnotationConfiguration.createExtendedMappings(AnnotationConfiguration.java:187) 
    at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:277) 
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1162) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:667) 
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1452) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1390) 
    ... 53 more 

यह क्या है और क्यों मैं हो रही है: वर्ग org.hibernate.cfg.ExtendedMappings सुपर वर्ग के रूप में इंटरफ़ेस org.hibernate.cfg.Mappings है इस? कोई सुराग?

मेरे sessionFactory लगता है कि यह

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="annotatedClasses"> 
     <list> 
     <!-- Entity classes from package com.mydomain.data.entities --> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
     <prop key="hibernate.show_sql">false</prop> 
     </props> 
    </property> 
    </bean> 
+0

स्पिंग का परीक्षण समर्थन एकीकरण परीक्षण के लिए है, यूनिट परीक्षण नहीं। आप यूनिट परीक्षण के लिए सादे जुनीट या टेस्टएनजी का उपयोग कर सकते हैं। तो आप वास्तव में क्या परीक्षण करने की कोशिश कर रहे हैं? – SteveD

उत्तर

5

अब समस्या किसी भी वसंत या टेस्टएनजी से संबंधित प्रतीत नहीं होती है। मुख्य भाग यह है:

java.lang.IncompatibleClassChangeError: class org.hibernate.cfg.ExtendedMappings has interface org.hibernate.cfg.Mappings as super class 

क्या आप सुनिश्चित हैं कि आपका क्लासस्पैट ठीक है? अर्थात। आपके पास हाइबरनेट मॉड्यूल का संगत संस्करण है और वहां दोहराव नहीं है?

क्या होगा यदि आप एक सरल TestNG परीक्षण है कि निम्न करता है बनाने के लिए:

Class.forName("org.hibernate.cfg.ExtendedMappings"); 

?

+0

इसलिए यदि मैं परीक्षा देता हूं एक खाली संदर्भ मैं क्लास.forनाम नामक एक परीक्षण चला सकता हूं, जो मुझे देता है: java.lang.IncompatibleClassChangeError: class org.hibernate.cfg.ExtendedMappings में इंटरफ़ेस org.hibernate.cfg है। सुपर क्लास के रूप में मैपिंग्स लेकिन जब मैं वही चलाता हूं मेरे सर्वलेट संदर्भ में, मुझे कोई समस्या नहीं है। और उनके पास एक ही कक्षा है। – niklassaers

+0

मेरा मानना ​​है कि विस्तारित मैपिंग्स को मेरी किसी भी जार-फाइल में परिभाषित किया गया है, हाइबरनेट-एनोटेशन.जर में है। – niklassaers

+0

हम्म, ऐसा इसलिए हो सकता है क्योंकि मैं हाइबरनेट 3.5-बीटा 1 को हाइबरनेट-एनोटेशन 3.4 के साथ चला रहा हूं। मुझे 3.4 पर कोशिश करने और डाउनग्रेड करने दें और देखें कि वे अधिक गठबंधन हैं या नहीं :-) – niklassaers

1

स्प्रिंग दस्तावेज में TestNG पर अध्याय से परामर्श करें: Spring 2.5 के लिए

+0

चिंता न करें, मैंने स्प्रिंग 3 रेफरेंस मैनुअल में दो बार "स्प्रिंग टेस्ट कॉन्टेक्स्ट फ्रेमवर्क" पढ़ने और कुछ ट्यूटोरियल पढ़ने के बाद यहां लिखा है – niklassaers

7

आपका परीक्षण ckass के लिए AbstractTestNGSpringContextTests का विस्तार करने की जरूरत है। या यदि आपका कोड डेटाबेस डेटाबेस का परीक्षण कर रहा है तो विस्तार करने के लिए एक और उपयोगी वर्ग AbstractTransactionalTestNGSpringContextTests है।

+0

धन्यवाद। सारस्टेस्टएनएसप्रिंग कोंटेक्स्टटेस्ट्स को विस्तारित करने से यह संदर्भ लोड हो गया है, लेकिन यह प्रारंभ करते समय मुझे एक अजीब अपवाद देता है। मैंने अपने प्रश्न को – niklassaers

+0

पर दिए गए अपवादों के साथ अपडेट किया है, कृपया इसे वोट दें क्योंकि यह मूल प्रश्न का उत्तर है और जो मैं खोज रहा था (उदाहरण: टेस्टएनजी के साथ वसंत का उपयोग करना) –

0

आप हाइबरनेट-एनोटेशन-3.5.0-बीटा -1 को हाइबरनेट-कोर-3.5.0-बीटा -1 के साथ संरेखित करने की कोशिश कर सकते हैं।

मुझे अभी भी java.lang.IncompatibleClassChangeError मिलता है, क्योंकि मैं "पुरानी" टिप्पणियों का उपयोग कर रहे हाइबरनेट खोज का उपयोग करने की कोशिश कर रहा हूं।

यह भी सुनिश्चित नहीं है कि आप जेबॉस चला रहे हैं, लेकिन यदि आप हैं तो आपको यह त्रुटि कोर 3.5.0 के साथ मिल जाएगी।

+0

यदि आप हाइबरनेट-कोर-3.5.एक्स का उपयोग कर रहे हैं, तो इसमें एनोटेशन (और इकाई प्रबंधक) शामिल होना चाहिए - हाइबरनेट https://www.hibernate.org/397.html – John

+0

के अनुसार अलग जार की आवश्यकता नहीं है मैंने क्या सोचा, लेकिन मुझे अभी भी एनोटेशन खींचने की जरूरत है। यदि आप हाइबरनेट-एनोटेशन पोम देखते हैं तो इसमें निर्भरता के रूप में हाइबरनेट-कोर है। मुझे लगता है कि हाइबरनेट का मतलब है कि संस्करण संख्या गठबंधन हैं। या मैं बहुत ज्यादा बीयर पी रहा हूँ :) –

1

मेरे लिए यह समस्या इसलिए हुई क्योंकि मेरे पास अलग-अलग हाइबरनेट संस्करण शामिल थे, न कि उनमें से किसी तीसरे पक्ष की वजह से।यह सुनिश्चित करने के लिए कि आप केवल एक हाइबरनेट संस्करण का उपयोग कर रहे हैं, अपने प्रोजेक्ट/पोम्स की एक स्वीप सार्थक है।

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