मैं डेटाबेस "वर्कर" कक्षाओं पर जुनीट परीक्षण चलाने की कोशिश कर रहा हूं जो प्राप्त करने के लिए 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);
को
लाइनों कार्यकर्ता वर्ग डेटा स्रोत ढूँढने में सक्षम है, लेकिन कह रही है कि "उपयोगकर्ता नाम सर्वर पर लॉगइन करने में विफल रहा" एक त्रुटि दे रही है विफल रहता है।
यदि मैं डेटा स्रोत को पास करता हूं जो मैं जुनीट विधि में सीधे कार्यकर्ता में बनाता हूं, तो यह क्वेरी को कनेक्ट और चला सकता है।
तो, मैं जानना चाहता हूं कि डेटासोर्स को कैसे बांधना है जिसे वेब कंटेनर में बिना कार्यकर्ता वर्ग द्वारा देखा जा सकता है।