2010-08-11 20 views
15

मैं डेटाबेस "वर्कर" कक्षाओं पर जुनीट परीक्षण चलाने की कोशिश कर रहा हूं जो प्राप्त करने के लिए InitialContext पर एक जेएनडीआई लुकअप करते हैं। कार्यकर्ता वर्ग आमतौर पर एक ग्लासफ़िश v3 ऐप सर्वर पर चल रहे होते हैं जिसमें उपयुक्त जेडीबीसी संसाधन परिभाषित होते हैं।मैं जुनीट परीक्षण के लिए एक प्रारंभिक कॉन्टेक्स्ट में डेटासोर्स को कैसे बांध सकता हूं?

ऐप सर्वर पर तैनात किए जाने पर कोड ठीक ठीक चलता है लेकिन जुनीट परीक्षण वातावरण से नहीं चलता है, क्योंकि स्पष्ट रूप से यह jndi संसाधन नहीं ढूंढ सकता है। इसलिए मैंने टेस्ट क्लास में एक InitialContext सेट करने का प्रयास किया जो उचित संदर्भ में डेटास्रोत को बांधता है, लेकिन यह काम नहीं करता है।

यहाँ कोड मैं परीक्षण में है

@BeforeClass 
public static void setUpClass() throws Exception { 
    try { 
     // Create initial context 
     System.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
      "org.apache.naming.java.javaURLContextFactory"); 
     System.setProperty(Context.URL_PKG_PREFIXES, 
      "org.apache.naming"); 
     InitialContext ic = new InitialContext(); 

     ic.createSubcontext("java:"); 
     ic.createSubcontext("java:/comp"); 
     ic.createSubcontext("java:/comp/env"); 
     ic.createSubcontext("java:/comp/env/jdbc"); 

     // Construct DataSource 
     SQLServerConnectionPoolDataSource testDS = new SQLServerConnectionPoolDataSource(); 
     testDS.setServerName("sqlserveraddress"); 
     testDS.setPortNumber(1433); 
     testDS.setDatabaseName("dbname"); 
     testDS.setUser("username"); 
     testDS.setPassword("password"); 

     ic.bind("java:/comp/env/jdbc/TestDS", testDS); 

     DataWorker dw = DataWorker.getInstance(); 
    } catch (NamingException ex) { 
     Logger.getLogger(TitleTest.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

फिर DataWorker वर्ग निम्न कोड के साथ एक विधि है, और अधिक या कम

InitialContext ic = null; 
DataSource ds = null; 
Connection c = null; 
PreparedStatement ps = null; 
ResultSet rs = null; 
String sql = "SELECT column FROM table"; 
try{ 
    ic = new InitialContext(); 
    ds = (DataSource) ic.lookup("jdbc/TestDS"); 
    c = ds.getConnection(); 
    ps = c.prepareStatement(sql); 
    // Setup the Prepared Statement 
    rs = ps.executeQuery(); 
    if(rs.next){ 
     //Process Results 
    } 
}catch(NamingException e){ 
    throw new RuntimeException(e); 
}finally{ 
    //Close the ResultSet, PreparedStatement, Connection, InitialContext 
} 

अगर मैं बदल
ic.createSubContext("java:/comp/env/jdbc");
ic.bind("java:/comp/env/jdbc/TestDS",testDS);
ic.createSubContext("jdbc");
ic.bind("jdbc/TestDS",testDS);
को
लाइनों कार्यकर्ता वर्ग डेटा स्रोत ढूँढने में सक्षम है, लेकिन कह रही है कि "उपयोगकर्ता नाम सर्वर पर लॉगइन करने में विफल रहा" एक त्रुटि दे रही है विफल रहता है।

यदि मैं डेटा स्रोत को पास करता हूं जो मैं जुनीट विधि में सीधे कार्यकर्ता में बनाता हूं, तो यह क्वेरी को कनेक्ट और चला सकता है।

तो, मैं जानना चाहता हूं कि डेटासोर्स को कैसे बांधना है जिसे वेब कंटेनर में बिना कार्यकर्ता वर्ग द्वारा देखा जा सकता है।

उत्तर

1

जब मैंने आखिरकार कुछ साल पहले ऐसा कुछ करने की कोशिश की, तो मैंने अंततः छोड़ दिया और दोबारा प्रतिक्रिया दी: उस समय, आप एक कंटेनर के बाहर डेटासोर्स नहीं बना सके। शायद आप कर सकते हैं, अब, शायद किसी ने कुछ मजाक उड़ाया है।

फिर भी, यह बदबू आ रही है ... आपके पास डेटा स्रोत या जेएनडीआई लुकअप या ऐसे पर सीधे कोई भी "व्यावसायिक तर्क" कोड नहीं होना चाहिए। यह आपके कोड के बाहर एक साथ वायर्ड होने के लिए सभी नलसाजी है।

आपका डिज़ाइन कितना लचीला है? यदि परीक्षण के तहत आपका कोड डेटासोर्स पर सीधे निर्भर है (या यहां तक ​​कि अपना कनेक्शन भी प्राप्त करता है), इसे दोबारा दोहराएं। कनेक्शन को इंजेक्शन करने से आप सादे पुराने जेडीबीसी के साथ अपनी सभी चीजों का परीक्षण कर सकते हैं, यहां तक ​​कि इन-मेमोरी कार्यान्वयन का उपयोग करके, और इसे करने के लिए आपको बहुत अनावश्यक (परीक्षण के लिए, वैसे भी) बुनियादी ढांचे को बढ़ावा देने से बचाया जा सकता है।

0

मैंने पाया कि यह उदाहरण गलत भी है। यह मेरे लिए काम किया। संदर्भों में से प्रत्येक में गलत है और वहाँ नहीं होना चाहिए:

ic.createSubcontext("java:comp"); 
ic.createSubcontext("java:comp/env"); 
ic.createSubcontext("java:comp/env/jdbc"); 

final PGSimpleDataSource ds = new PGSimpleDataSource(); 
ds.setUrl("jdbc:postgresql://localhost:5432/mydb"); 
ds.setUser("postgres"); 
ds.setPassword("pg"); 

ic.bind("java:comp/env/jdbc/mydb", ds); 

अंतर आप ध्यान दें हूँ कि '/' के बाद जावा का अर्थ है।

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

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