2010-07-19 8 views
6

मैं स्प्रिंग रू प्रोजेक्ट के लिए एक जुनीट परीक्षण लिखने की कोशिश कर रहा हूं। अपने परीक्षण इकाई वर्गों के उपयोग की आवश्यकता है, मैं निम्नलिखित अपवाद प्राप्त करें:स्प्रिंग रू के साथ जुनीट परीक्षण का उपयोग कैसे करें? (EntityManager के साथ समस्याएं)

java.lang.IllegalStateException: Entity manager has not been injected 
(is the Spring Aspects JAR configured as an AJC/AJDT aspects library?) 

स्प्रिंग पहलुओं जार सही तरीके से कॉन्फ़िगर किया जाना लग रहा है।

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aspects</artifactId> 
    <version>${spring.version}</version> 
</dependency> 

और

<plugin> 
    <configuration> 
    <outxml>true</outxml> 
    <aspectLibraries> 
    <aspectLibrary> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aspects</artifactId> 
    </aspectLibrary> 
    </aspectLibraries> 
    <source>1.6</source> 
    <target>1.6</target> 
    </configuration> 
</plugin> 

और वर्गों है कि इकाई वर्गों का उपयोग ठीक है, जब एक JUnit परीक्षण से नहीं बुलाया काम करते हैं: विशेष रूप से, मैं pom.xml फ़ाइल में निम्न है। कोई विचार है कि मैं चीजों को कैसे सेट कर सकता हूं ताकि एंटीटी मैनेजर को जुनीट टेस्ट से इंजेक्शन दिया जा सके?

public class ServiceExampleTest { 

    @Test 
    public void testFoo() { 
    FooService fs = new FooServiceImpl(); 
    Set<Foo> foos = fs.getFoos(); 
    } 
} 

यह अपवाद फेंकने के लिए पर्याप्त है:

यहाँ मेरी टेस्ट वर्ग (कम या ज्यादा) है। FooServiceImpl क्लास Foo का एक सेट देता है, जहां फू एक इकाई वर्ग है। getFoos() विधि सामान्य तरीके से चलने पर विधि कार्य करती है। समस्या केवल यूनिट परीक्षणों के संदर्भ में आता है।

+0

आप अपने परीक्षण वर्ग पोस्ट कर सकते हैं? मैंने स्प्रिंग रू का कभी भी उपयोग नहीं किया है, लेकिन सामान्य वसंत परीक्षणों के साथ आपको आमतौर पर सारस्ट्रिंगजुनिट 4 टेस्ट (या कुछ) का विस्तार करना होगा या परीक्षणों के लिए एनोटेशन के माध्यम से कस्टम स्प्रिंग रनर का उपयोग करना होगा। – ponzao

उत्तर

3

यह स्प्रिंग रू के साथ एक अविश्वसनीय रूप से परेशान करने वाली समस्या है और मुझे इसके लिए आधिकारिक समाधान नहीं मिला है।

  • कॉपी अपनी परियोजना के लिए वसंत-पहलुओं जार फिर अपने इकाई परीक्षण चलाने के लिए अपने प्रोजेक्ट्स AspectJ पहलू पथ
  • उपयोग Maven में जोड़ने (और याद आती है:

    लेकिन ... यहां दो तरीके हैं हरी पट्टी :()

अपनी परियोजना पर विकल्प पर राइट क्लिक के लिए चयन गुण> AspectJ बिल्ड -।> पहलू पथ टैब

+0

मैं इस उत्तर को स्वीकार करूंगा, लेकिन मैं इसे आसानी से सत्यापित करने की स्थिति में नहीं हूं, क्योंकि अब मैं रू का उपयोग नहीं करता हूं। (मैं एक अलग नौकरी पर हूँ।) –

+0

@FarmBoy आप यह नहीं कह सकते कि अब आप क्या उपयोग कर रहे हैं :) –

+0

ग्रोवी/Grails। मुझे यह पसंद है। –

6

ponzao सही है मैं कर रहा हूँ। मेरे टेस्ट क्लास को AbstractJunit4SpringContextTests का विस्तार करके सभी वसंत इंजेक्शन जादू रखें।

उदा।

@ContextConfiguration(locations = { "/META-INF/spring/applicationContext.xml" }) 
public class SelfRegistrationTest extends AbstractJUnit4SpringContextTests { 
+0

बुरा लगता है, लेकिन मेरे लिए काम करता प्रतीत होता है। – kipz

1

आपकी यूनिट टेस्ट क्लास में @MockStaticEntityMethods एनोटेशन होना चाहिए।

0

मैं भी उसी अपवाद में भाग रहा था और सब कुछ ठीक से कॉन्फ़िगर किया गया था। मैंने परियोजना को हटा दिया और एसटीएस (स्प्रिंगसोर्स टूल सूट) में फिर से आयात किया और यह समस्या चली गयी।

यह सुनिश्चित नहीं है कि यह क्यों तय किया गया है लेकिन यह समस्या मेरे मामले में एसटीएस पर स्विच करने से पहले आरयू जेनरेटेड प्रोजेक्ट को प्रबंधित करने के लिए ग्रहण के उपयोग के कारण हो सकती थी।

3

आपकी यूनिट टेस्ट क्लास में @MockStaticEntityMethods एनोटेशन होना चाहिए।

बस @migue द्वारा उपर्युक्त उत्तर में अधिक जानकारी जोड़ना चाहता था क्योंकि मुझे यह जानने के लिए कुछ समय लगा कि यह काम कैसे प्राप्त करें। साइट http://java.dzone.com/articles/mock-static-methods-using-spring-aspects ने वास्तव में मुझे नीचे दिए गए उत्तर को प्राप्त करने में मदद की।

टेस्ट क्लास के माध्यम से इकाई प्रबंधक इंजेक्ट करने के लिए मैंने यही किया है। सबसे पहले अपनी टेस्ट क्लास को @MockStaticEntityMethods के साथ एनोटेट करें और MockEntityManager क्लास बनाएं (जो एक कक्षा है जो केवल EntityManager इंटरफ़ेस लागू करती है)।

@Test 
public void testFoo() { 
    // call the static method that gets called by the method being tested in order to 
    // "record" it and then set the expected response when it is replayed during the test 
    Foo.entityManager(); 
    MockEntityManager expectedEntityManager = new MockEntityManager() { 
    // TODO override what method you need to return whatever object you test needs 
    }; 
    AnnotationDrivenStaticEntityMockingControl.expectReturn(expectedEntityManager); 

    FooService fs = new FooServiceImpl(); 
    Set<Foo> foos = fs.getFoos(); 
} 

जब आप fs.getFoos कहा जाता है() AnnotationDrivenStaticEntityMockingControl Foo.entityManager (के रूप में अपने नकली इकाई प्रबंधक इंजेक्शन होगा) एक है इसका मतलब यह है:

तो फिर आप अपने ServiceExampleTest परीक्षण कक्षा में निम्न कर सकते हैं स्थैतिक विधि

यह भी ध्यान दें कि यदि fs.getFoos() फू और बार जैसे एंटीटी कक्षाओं पर अन्य स्थिर तरीकों को कॉल करता है, तो उन्हें इस परीक्षण मामले के हिस्से के रूप में भी निर्दिष्ट किया जाना चाहिए।

तो उदाहरण के लिए कहें कि फू के पास "getAllBars (Long fooId)" नामक एक स्थिर खोज विधि थी जिसे fs.getFoos() कहा जाता है, तो आपको एनोटेशन DrivenStaticEntityMockingControl कार्य करने के लिए निम्न कार्य करने की आवश्यकता होगी।

@Test 
public void testFoo() { 
    // call the static method that gets called by the method being tested in order to 
    // "record" it and then set the expected response when it is replayed during the test 
    Foo.entityManager(); 
    MockEntityManager expectedEntityManager = new MockEntityManager() { 
    // TODO override what method you need to return whatever object you test needs 
    }; 
    AnnotationDrivenStaticEntityMockingControl.expectReturn(expectedEntityManager); 

    // call the static method that gets called by the method being tested in order to 
    // "record" it and then set the expected response when it is replayed during the test 
    Long fooId = 1L; 
    Foo.findAllBars(fooId); 
    List<Bars> expectedBars = new ArrayList<Bar>(); 
    expectedBars.add(new Bar(1)); 
    expectedBars.add(new Bar(2)); 
    AnnotationDrivenStaticEntityMockingControl.expectReturn(expectedBars); 

    FooService fs = new FooServiceImpl(); 
    Set<Foo> foos = fs.getFoos(); 
} 

याद रखें AnnotationDrivenStaticEntityMockingControl उसी क्रम कि fs.getFoos() अपने स्थिर तरीकों कॉल में होना चाहिए।

0

लंबे समय प्रश्न के बाद, लेकिन मैं एक काम कर समाधान जब ग्रहण के भीतर से वसंत रू इकाई परीक्षण चलाने के लिए कोशिश कर रहा है ...

  1. परियोजना ग्रहण में खुला है
  2. ग्रहण में, परियोजना> साफ > एक बार फिर से निर्माण पूरा हो गया है, एक कंसोल विंडो में पुनर्निर्माण (स्वचालित या मैन्युअल कोई फर्क नहीं पड़ता)
  3. , Maven स्वच्छ और फिर से पैकेज (स्वच्छ आवश्यकता होती है) है:

    mvn clean package

या अपने इकाई परीक्षण Maven में असफल अगर कर रहे हैं (और आप अपने परीक्षण डीबगिंग के लिए ग्रहण की जरूरत है)

mvn clean package -Dmaven.test.skip=true 

4. एक बार पैकेज सफल होता है, तो ग्रहण में वापस ताज़ा करें।

अब आप एक्लिप्स में सफलतापूर्वक यूनिट परीक्षण चलाने में सक्षम होना चाहिए। मैंने संपादन इकाइयों को इकाई प्रबंधक त्रुटि की सबसे बड़ी आवृत्ति के कारण पाया। जब मैं उन्हें संपादित करने के बारे में स्पष्ट रहा, तो मैं अन्य वर्गों और यूनिट परीक्षणों को संपादित कर सकता हूं सफलतापूर्वक चलना जारी रखेंगे।

0

यह वसंत रू के साथ मेरे लिए काम किया: इस तरह पता वर्ग के साथ

import static org.junit.Assert.assertEquals; 

import org.junit.Test; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; 

import com.jitter.finance.analyzer.domain.Address; 

@ContextConfiguration(locations = { "classpath*:/META-INF/spring/applicationContext*.xml"}) 
public class EmTest extends AbstractJUnit4SpringContextTests { 

    @Test 
    public void checkEm(){ 
     Address a = new Address(); 
     a.setName("Primo"); 
     a.persist(); 

     Address b = new Address(); 
     b.setName("Secondo"); 
     b.persist(); 

     for(Address ad : Address.findAllAddresses()){ 
      System.out.println(ad.getName()); 
      assertEquals(ad.getName().charAt(ad.getName().length()-1), 'o'); 
     } 
    } 
} 

:

import org.springframework.roo.addon.javabean.annotations.RooJavaBean; 
import org.springframework.roo.addon.javabean.annotations.RooToString; 
import org.springframework.roo.addon.jpa.annotations.activerecord.RooJpaActiveRecord; 

@RooJavaBean 
@RooToString 
@RooJpaActiveRecord 
public class Address { 
    private String name; 
} 
संबंधित मुद्दे