मैं जानता हूँ कि इस सवाल stackoverflow में कई बार कहा गया है, लेकिन किसी भी तरह अभी भी कुछ परेशानी एक समाधान पता लगाना था। निम्न उदाहरण मुझे लगता है कि स्थिर तरीकोंफैक्टरी डिजाइन पैटर्न - स्थिर तरीकों का उपयोग इसलिए नहीं कि इकाई परीक्षण एक समस्या
public class ConnectionFactory
{
public static Connection createConnection(ConnectionType connectionType, String ipAddr, Integer port)
{
//Some error checking
switch(connectionType)
{
case TCP:
return createTcpConnection(ipAddr, port);
case UDP:
return createUdpConnection(ipAddr, port);
case RTP:
return createRtpConnection(ipAddr, port);
case SCTP:
return createRtpConnection(ipAddr, port);
default:
break;
}
}
// TcpConnection, RtpConnection, SctpConnection and UdpConnection implement interface Connection
public Connection createTcpConnection()
{
Connection connection = new TcpConnection();
.....
.....
return connection;
}
public Connection createUdpConnection()
{
Connection connection = new UdpConnection();
.....
.....
return connection;
}
....
....
}
है और लगता है के लिए एक अच्छा मामला है अगर मैं निम्नलिखित
public class CommunicationService
{
public void initConnectionPool(ConnectionType connectionType)
{
for(int i = 0; i < MAX_CONNECTIONS; i++)
connectionList.add(ConnectionFactory.createConnection(connectionType, "domain.com", 40203));
//Some more code here to do further processing
......
......
}
//Some more methods
}
इस तरह की तरह एक CommunicationService है, विभिन्न संचार सेवाओं बना सकते हैं और एक से अधिक प्रकार बनाए रख सकते हैं कनेक्शन।
मैं initConnectionPool विधि का परीक्षण करना चाहते हैं और एक इकाई परीक्षण वातावरण में, सॉकेट निर्माण निश्चित रूप से असफल हो जायेगी।
मैं एक ठोस वर्ग के लिए ConnectionFactory बदल सकते हैं और इसे बाहर नकली कर सकते हैं। लेकिन क्या यह मामला स्थिर तरीकों के साथ कक्षा बनाने के लिए एक अच्छी स्थिति नहीं है? मैं कनेक्शन फैक्टरी में किसी भी राज्य को बनाए रखने की कोशिश नहीं कर रहा हूं। तो, स्थिर तरीकों जहां यह परीक्षण समस्या पैदा हो सकती है जब हम स्थिर तरीकों का उपयोग करते हैं उपयुक्त हो सकता है का उपयोग करते हुए तो क्या होगा? या यहां स्थिर तरीकों का उपयोग करना उचित नहीं है?
संपादित करें: समाधान मैं
public class CommunicationService
{
public void initConnectionPool(ConnectionType connectionType)
{
for(int i = 0; i < MAX_CONNECTIONS; i++)
connectionList.add(connectToHost(connectionType));
//Some more code here to do further processing
......
......
}
public Connection connectToHost(ConnectionType connectionType)
{
ConnectionFactory.createConnection(connectionType, "domain.com", 40203)
}
//Some more methods
}
साथ चला गया में परीक्षण connectToHost overrode और एक नकली लौट आए।
आपका कनेक्शन फैक्ट्री पहले से ही एक ठोस (गैर-सार) वर्ग है। स्थैतिक के विपरीत 'गतिशील' होगा, हालांकि मुझे अक्सर इस संदर्भ में उपयोग नहीं किया जाता है। केवल स्थिर विधियों वाला एक वर्ग आमतौर पर 'उपयोगिता वर्ग' के रूप में संदर्भित होता है। –