2010-08-25 16 views
13

मेरे पास एक बहु मॉड्यूल स्प्रिंग प्रोजेक्ट है जिसे मैंने मैवेन का उपयोग करके स्थापित किया है:कक्षाओं में निर्भरता के परीक्षण संसाधन नहीं?

my-root (pom) 
    - my-logic 
    - my-webapp (depending on my-logic) 
    - my-consoleapp (depending on my-logic) 

मेरा टेस्ट क्लास AbstractTransactionalJUnit4SpringContextTests से प्राप्त होता है और ApplicationContext को स्थापित करने के लिए @ContextCofiguration का उपयोग करता है।

उदा। स्प्रिंग कंट्रोलर के लिए टेस्ट क्लास:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
    "classpath:applicationContext-logic-test.xml", 
    "classpath:applicationContext-web-test.xml"}) 
public class ControllerTest extends AbstractTransactionalJUnit4SpringContextTests { 

    @Autowired 
    private ApplicationContext applicationContext; 
    ... 
} 

जैसा कि आप देख सकते हैं कि प्रति मॉड्यूल एक कॉन्फ़िगरेशन एक्सएमएल है। मेरे पास टेसिंग के लिए अलग-अलग कॉन्फ़िगरेशन हैं, प्रत्येक मॉड्यूल के परीक्षण/संसाधनों में रहते हैं (और अतिरिक्त प्रत्यय "-टेस्ट")। यह सभी काम करता है (कक्षा संकलन, रन और जुनीट परीक्षण सफल होते हैं) अगर मैं ग्रहण में जुनीट परीक्षण चलाता हूं।

अब मेरी समस्या के लिए: मेवेन का उपयोग कर परीक्षण चलाना काम नहीं करेगा! (उदा। my-root पर "रन एज़"> "मेवेन इंस्टॉल" के साथ (मैं m2eclipse का उपयोग करता हूं))। विशेष रूप से, यह निम्नलिखित अपवाद फेंक देगा:

java.io.FileNotFoundException: क्लास पथ संसाधन [applicationContext-logic-test.xml] खोला नहीं जा सकता क्योंकि यह मौजूद नहीं है '

ऐसा लगता है कि मैवेन my-logic/src/test/resources से फ़ाइलों को my-webapp के यूनिट परीक्षण चलाते समय स्थापित क्लासपाथ में नहीं जोड़ता है।

मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

13

ऐसा लगता है कि मैवेन my-logic/src/test/resources से मेरी वेबपैप के यूनिट परीक्षण चलाते समय स्थापित क्लासपाथ में फ़ाइलों को नहीं जोड़ता है।

नहीं, वास्तव में, ऐसा नहीं है। सबसे पहले, मेवेन बाइनरी निर्भरताओं का उपयोग करता है जिन्हें हमेशा स्थानीय भंडार के माध्यम से हल किया जाता है। और दूसरा, बाइनरी निर्भरताओं में परीक्षण सामग्री शामिल नहीं है।

लेकिन क्या तुम कर सकते हो रहा है:

  1. कॉन्फ़िगर my-logic मॉड्यूल एक परीक्षण जार jar:test-jar
  2. कॉन्फ़िगर my-webapp मॉड्यूल का उपयोग कर इस परीक्षण जार (एक test गुंजाइश का उपयोग) पर निर्भर बनाने के लिए।

# 1 के लिए, आपको पोम में मेवेन जार प्लगइन को कॉन्फ़िगर करना होगा।my-logic की xml:

<project> 
    <build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.2</version> 
     <executions> 
     <execution> 
      <goals> 
      <goal>test-jar</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
    </build> 
</project> 

और Maven package दौरान target/test-classes की सामग्री के साथ एक जार बना सकते हैं और स्थापित हो जाएगा/यह की तैनाती।

# 2 के लिए, my-webapp की pom.xml में परीक्षण जार पर निर्भरता की घोषणा:

<project> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>com.myco.app</groupId> 
     <artifactId>foo</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>test-jar</type> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
    ... 
</project> 

कि यह करना चाहिए।

+0

इस उत्कृष्ट उत्तर के लिए बहुत बहुत धन्यवाद! मैंने इस समाधान का उपयोग किया और यह काम करता है। अब जब आपने यह समझाया कि यह मेरे लिए भी स्पष्ट है कि सभी (बाहरी) निर्भरताओं के परीक्षण संसाधन क्लासपाथ में शामिल नहीं हैं। उन्हें कैसे होना चाहिए लेकिन किसी भी तरह यह अच्छा होगा अगर मेरे अपने मॉड्यूल से संसाधन शामिल किए जाएंगे। भले ही मुझे नहीं पता कि यह वास्तव में कैसे काम करेगा, अब मैं इसके बारे में सोचता हूं;) – apropoz

+0

@apropoz आपका स्वागत है। मेवेन के साथ विचार यह है कि मॉड्यूल स्वयं निहित हैं: आप अपने भाइयों के बिना एक मॉड्यूल की जांच कर सकते हैं और इसे बना सकते हैं। कुछ भी जो सापेक्ष पथ को शामिल करेगा, इसे तोड़ देगा, जो वांछनीय नहीं है। –

1

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

आप पूरा करने के लिए आप आप एक परियोजना है जो संसाधनों आप परीक्षण के लिए आवश्यकता होती है बनाना चाहिए करते हैं और बनाने के लिए कोशिश कर रहे हैं क्या यह एक परीक्षण दोनों मेरे-तर्क की निर्भरता और मेरी-webapp scoped चाहते हैं

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