2011-07-18 10 views
5

मेरे पास कई सत्र बीन्स हैं जिनके लिए मैंने यूनिट परीक्षण लिखे हैं। मैंने मेवेन को src/main/resource/META-INF निर्देशिका में persistence.xml शामिल करने के लिए सेटअप किया है जो विकास उद्देश्यों के लिए स्थानीय MySQL डेटाबेस को संदर्भित करता है। मेरे पास src/test/संसाधन/मेटा-आईएनएफ निर्देशिका में एक और persistence.xml है जो एम्बेडेड डर्बी डेटाबेस __default को संदर्भित करता है। परीक्षण एक एम्बेडेड ग्लासफ़िश 3.1 कंटेनर पर तैनात किए जाते हैं।एम्बेडेड ग्लासफ़िश मेवेन टेस्ट संसाधनों को अनदेखा करता है

java.lang.RuntimeException: javax.naming.NamingException: Lookup failed for 'jdbc/mylog' 

JDBC/mylog MySQL डेटाबेस है कि मुख्य निर्देशिका में दृढ़ता इकाई को संदर्भित करता है:

जब मैं परीक्षण तथापि चलाने के लिए, मैं निम्नलिखित त्रुटि मिलती है। यह स्पष्ट रूप से परीक्षण निर्देशिका में दृढ़ता इकाई को अनदेखा कर रहा है लेकिन मुझे इस बात का कोई संकेत नहीं है कि क्यों।

मैवेन क्लासपैथ को यथासंभव सही ढंग से सेट कर रहा है, जहां तक ​​मैं कह सकता हूं, कक्षाओं से पहले परीक्षण कक्षाओं और वास्तविक लक्ष्य/परीक्षण-वर्ग/मेटा-आईएनएफ निर्देशिका में एक झांक के साथ पता चलता है कि यह सही, एम्बेडेड डर्बी, दृढ़ता की प्रतिलिपि बनाता है इकाई।

[DEBUG] Test Classpath : 
[DEBUG] C:\Users\Laurens\Documents\Projects\Mylog\target\test-classes 
[DEBUG] C:\Users\Laurens\Documents\Projects\Mylog\target\classes 
[DEBUG] C:\Users\Laurens\.m2\repository\org\eclipse\persistence\eclipselink\2.2.0\eclipselink-2.2.0.jar 
[DEBUG] C:\Users\Laurens\.m2\repository\org\eclipse\persistence\javax.persistence\2.0.3\javax.persistence-2.0.3.jar 
[DEBUG] C:\Users\Laurens\.m2\repository\org\eclipse\persistence\org.eclipse.persistence.jpa.modelgen.processor\2.2.0\org.eclipse.persistence.jpa.modelgen.processor-2.2.0.jar 
[DEBUG] C:\Users\Laurens\.m2\repository\org\glassfish\extras\glassfish-embedded-all\3.1\glassfish-embedded-all-3.1.jar 
[DEBUG] C:\Users\Laurens\.m2\repository\javax\javaee-web-api\6.0\javaee-web-api-6.0.jar 
[DEBUG] C:\Users\Laurens\.m2\repository\junit\junit\4.8.1\junit-4.8.1.jar 

ग्लासफ़िश को उचित दृढ़ता इकाई का उपयोग करने के तरीके के बारे में कोई संकेत बहुत सराहना की! धन्यवाद!

+0

मेरे पास विभिन्न आर्किटेक्चर स्थितियों के तहत एक समान समस्या थी और गंदे समाधान को एक persistence.xml दोनों में लगातार विलय, उत्पादन और परीक्षण में विलय करना था। –

उत्तर

11

एम्बेडेड ग्लासफ़िश का उपयोग करके परीक्षण चलाते समय, जेपीए प्रदाता मेवेन-सिक्योरफायर-प्लगइन लक्ष्य (जिसे परीक्षण चरण चलाने के लिए उपयोग किया जाता है) निष्पादित करने से पहले कमांड लाइन पर प्रदर्शित क्लासपाथ का उपयोग नहीं करता है। एंबेडेड ग्लासफ़िश उन कलाकृतियों को तैनात करता है जो एक परीक्षण स्कोप के हिस्से के रूप में उपलब्ध हैं, ScatteredArchive के रूप में। यह बिखरा हुआ संग्रह आमतौर पर java.io.tmpdir निर्देशिका में gfembed<a_random_number>tmp नाम से बनाया गया है, जब तक कि एम्बेडेड ग्लासफ़िश कॉन्फ़िगरेशन ने ग्लासफ़िश स्थापना रूट और ग्लासफ़िश डोमेन का स्थान निर्दिष्ट नहीं किया हो।

जब एम्बेडेड ग्लासफ़िश डोमेन तैनात किए गए बिखरे हुए संग्रह के साथ तैयार किया जाता है, तो तैनात फ़ाइलों को आम तौर पर एक विस्फोटित निर्देशिका में कॉपी किया जाता है जिसमें आवेदन द्वारा आवश्यक सभी वर्ग (सभी निर्भरताओं सहित) होते हैं। यह निर्देशिका आमतौर पर GF_EMBED_DOMAIN_HOME/applications/<application_name> निर्देशिका में मौजूद होती है। आपके src/main/resources/META-INF और src/test/resources/META-INF निर्देशिकाओं से persistence.xml फ़ाइलों को यहां <application-name>/META-INF निर्देशिका में कॉपी किया गया है। राज्य की जरूरत नहीं है, जो पिछली बार कॉपी हो जाता है, या जो ओवरराइट नहीं किया जाता है वह वह है जिसे परीक्षण के दौरान जेपीए प्रदाता द्वारा उपयोग किया जाता है। यह हमेशा src/main/resources/META-INF में फ़ाइल होता है।

आप दो तरह से इस स्थिति पर काबू पाने के कर सकते हैं:

1. एक कस्टम Glassfish डोमेन विन्यास फाइल

आप एक डोमेन विन्यास फाइल निर्दिष्ट कर सकते हैं (domain.xml) कि jdbc/mylog के लिए डेटा स्रोत परिभाषा में शामिल होंगे का उपयोग करना । यही वह है जो मैं वर्तमान में इसके लिए बहुत लचीला हूं और डोमेन कॉन्फ़िगरेशन फ़ाइल में अन्य कॉन्फ़िगरेशन भी हो सकते हैं।कॉन्फ़िग फ़ाइल, की जरूरत है निर्दिष्ट निम्नलिखित तरीके से परीक्षण सेटअप के भाग के रूप:

Map<String, Object> props = new HashMap<String, Object>(); 
props.put("org.glassfish.ejb.embedded.glassfish.installation.root", "./glassfish-install/glassfish"); 
container = EJBContainer.createEJBContainer(props); 
context = container.getContext(); 
datasource = (DataSource) context.lookup("jdbc/mylog"); //You can lookup the datasource too, to confirm that your setup is successful. 

आगे उल्लिखित glassfish-install निर्देशिका और उसकी उप-निर्देशिका glassfish Maven परियोजना जड़ में मौजूद है (और भी संस्करण नियंत्रण में जाँच कर रहे हैं); glassfish निर्देशिका में domain1 नाम के ग्लासफ़िश डोमेन की निर्देशिका संरचना का प्रतिनिधित्व करने के लिए domain1/config की निर्देशिका संरचना होना चाहिए। परियोजना में संरचना नीचे स्क्रीनशॉट में देखी जा सकती है। अन्य संबंधित फाइलें (जेडीबीसी संसाधन एडाप्टर जेएआरएस और जैसे), ग्लासफ़िश इंस्टॉलेशन डायरेक्टरी से प्राप्त की जा सकती हैं, लेकिन आमतौर पर इन्हें सही तरीके से कॉन्फ़िगर किए गए एम्बेडेड ग्लासफ़िश रनटाइम द्वारा सही स्थान पर रखा जा सकता है।

Glassfish domain configuration file location

Glassfish डोमेन विन्यास फाइल की सामग्री को डिफ़ॉल्ट एक एम्बेडेड Glassfish द्वारा प्रयोग किया जाता से अलग हैं, (मेरे USECASE में जोड़ा प्रासंगिक प्रविष्टियों जहाँ मैं एकीकरण परीक्षण प्रदर्शन डेटा स्रोत और कनेक्शन पूल विन्यास के लिए छोड़कर, घटना आप के बजाय एक Glassfish स्थापना से एक को कॉपी करने की संभव के रूप में कम से कम परिवर्तन रखने के लिए, इच्छा में

<domain log-root="${com.sun.aas.instanceRoot}/logs" application-root="${com.sun.aas.instanceRoot}/applications" version="10.0"> 
    <system-applications/> 
    <applications/> 
    <resources> 
    <jdbc-resource pool-name="MyPool" jndi-name="jdbc/mylog"/> 
    ... 
    <jdbc-connection-pool driver-classname="" datasource-classname="org.apache.derby.jdbc.ClientDataSource" res-type="javax.sql.DataSource" description="" name="MyPool" ping="true"> 
     <property name="User" value="APP"></property> 
     <property name="RetrieveMessageText" value="true"></property> 
     <property name="CreateDatabase" value="true"></property> 
     <property name="ServerName" value="localhost"></property> 
     <property name="Ssl" value="off"></property> 
     <property name="SecurityMechanism" value="4"></property> 
     <property name="TraceFileAppend" value="false"></property> 
     <property name="TraceLevel" value="-1"></property> 
     <property name="PortNumber" value="1527"></property> 
     <property name="LoginTimeout" value="0"></property> 
     <property name="Password" value="APP"></property> 
     <property name="databaseName" value="MYDB"></property> 
    </jdbc-connection-pool> 
    ... 
    </resources> 
    <servers> 
    <server name="server" config-ref="server-config"> 
     <resource-ref ref="jdbc/__TimerPool"/> 
     <resource-ref ref="jdbc/__default"/> 
     <resource-ref ref="jdbc/mylog"/> 
    </server> 
    </servers> 
    ... 
... 

default domain.xml file can be downloaded from the java.net site, और संशोधित,: नीचे तैनात किया गया है)। persistence.xml फ़ाइलों

एक से अधिक

2. प्रतिलिपि बनाई जा रही बैकअप के लिए Maven पोम फाइल करने के लिए लक्ष्यों को जोड़ने के लिए, और src/test/resources/META-INF से src/main/resources/META-INF को persistence.xml फ़ाइल की प्रतिलिपि, test चरण से पहले कर सकते हैं। परीक्षण चरण पूरा होने के बाद, मूल बहाल किया जाता है। मैं इसके विवरण में नहीं जाऊंगा, क्योंकि इसी तरह के समाधान पर पहले से ही a related StackOverflow question में चर्चा की गई है। मैंने एकीकरण परीक्षणों के लिए इस दृष्टिकोण का उपयोग नहीं किया क्योंकि मुझे कस्टम क्षेत्र के निर्माण की तरह persistence.xml में किए जा सकने वाले परिवर्तनों से परे परिवर्तनों की आवश्यकता थी। मैं यूनिट-टेस्ट के लिए इसका उपयोग करता हूं, हालांकि इस तथ्य के कारण कि जेपीए प्रदाता persistence.xml फ़ाइल से target/test-classes की बजाय फ़ाइल क्लासपाथ ऑर्डर में पहले दिखाई देने के बावजूद लाएगा। यदि आप अपने जेपीए प्रदाता के रूप में हाइबरनेट का उपयोग करते हैं, तो org.hibernate.ejb लॉगर के लिए TRACE लॉगिंग सक्षम करना (Ejb3Configuration कक्षा लुकअप करने के लिए ज़िम्मेदार है) आपको यह विश्वास दिलाएगी कि test-classes में फ़ाइल नहीं ली जाएगी।


नोट:

जवाब में से अधिकांश मान लिया गया Glassfish 3.1 लेकिन साथ ही आगामी संस्करणों के लिए अच्छा पकड़ सकता है।

+0

वाह, यह आश्चर्यजनक रूप से विस्तृत विनीट है! मैं विकल्प को सबसे लचीला के रूप में चला गया और यह अब बेकार ढंग से काम कर रहा है। बहुत - बहुत धन्यवाद! – Laurens

+0

@Laurens, अच्छी तरह से, यह जानकर खुशी हुई कि यह मदद की थी। –

+0

ग्रेट उत्तर, विनीट। एम्बेडेड ग्लासफ़िश ने 3.1.2 तक अपग्रेड करने के बाद मेरे लिए काम करना बंद कर दिया, लेकिन जैसा कि आप यहां समझाते हैं, मैं इसे फिर से काम करने में कामयाब रहा। धन्यवाद! – Vetle

0

"एम्बेडेड ग्लासफ़िश कंटेनर" द्वारा, क्या आपका मतलब एक मैवेन प्लगइन है जो आपके लिए ग्लासफ़िश चलाता है? एक मेवेन प्लगइन के लिए क्लासपाथ अलग है और मैवेन टेस्ट क्लासपाथ से अलग तरीके से प्रबंधित किया जाता है। आपको एक अलग क्लासपाथ के साथ काम करने की आवश्यकता हो सकती है।

+0

हाय रयान, तेज प्रतिक्रिया के लिए धन्यवाद! मैं प्लगइन का उपयोग नहीं कर रहा हूँ। मेरे पास मेरे पीओएम में टेस्ट-स्कोप्ड निर्भरता के रूप में ग्लासफ़िश-एम्बेडेड-ऑल-3.1 है। – Laurens

+0

@Laurens: तो आपकी टेस्ट क्लास उसी JVM में ग्लासफ़िश शुरू कर रही है जिसमें परीक्षण चल रहे हैं? मैं जीएफ से परिचित नहीं हूं, लेकिन आप जो वर्णन कर रहे हैं वह गलत है। क्या आप समस्या का एक छोटा, निष्पादन योग्य उदाहरण प्रदान कर सकते हैं? –

+0

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

0

यह उत्तर मूर्खतापूर्ण लगता है लेकिन मैं एक ऐसे तरीके की तलाश कर रहा था जो मुझे Run As ->JUnit Test द्वारा ग्रहण से उन परीक्षणों को चलाने देता है। यह मैं इसे कैसे किया जाता है:

@BeforeClass 
public static void setUp() throws IOException { 
    Files.copy(new File("target/test-classes/META-INF/persistence.xml"), new File("target/classes/META-INF/persistence.xml")); 
    // ... 
} 

मैं सिर्फ परीक्षा/persistence.xml को कक्षाओं/persistence.xml को कॉपी कर रहा हूँ। यह काम।