समस्या अकेले सिंगलेट का परीक्षण नहीं कर रही है; पुस्तक कह रही है कि यदि आप जिस वर्ग को का परीक्षण करने की कोशिश कर रहे हैं, तो पर एक सिंगलटन पर निर्भर करता है, तो आपको शायद समस्याएं होंगी।
जब तक, आप (1) सिंगलटन को एक इंटरफ़ेस लागू नहीं करते हैं, और (2) उस इंटरफ़ेस का उपयोग करके सिंगलटन को अपनी कक्षा में इंजेक्ट करते हैं।
उदाहरण के लिए, एकमात्र आम तौर पर सीधे इस तरह instantiated कर रहे हैं:
public class MyClass
{
private MySingleton __s = MySingleton.getInstance() ;
...
}
MyClass
अब परीक्षण automatedly बहुत मुश्किल हो सकता है। उदाहरण के लिए, जैसा कि @ बोरीस पावलोविक ने अपने उत्तर में नोट किया है, यदि सिंगलटन का व्यवहार सिस्टम समय पर आधारित है, तो आपके परीक्षण अब सिस्टम समय पर भी निर्भर हैं, और आप उन मामलों का परीक्षण करने में सक्षम नहीं हो सकते हैं, जो कहते हैं, पर निर्भर करते हैं हफ्ते का दिन।से
public class SomeSingleton
implements SomeInterface
{
...
}
public class MyClass
{
private SomeInterface __s ;
public MyClass(SomeInterface s)
{
__s = s ;
}
...
}
...
MyClass m = new MyClass(SomeSingleton.getInstance()) ;
:
हालांकि, अपने सिंगलटन "एक अंतरफलक लिए कि इस प्रकार के रूप में कार्य को लागू करता है" तो आप अभी भी एक सिंगलटन कार्यान्वयन कि इंटरफ़ेस का, जब तक कि आप में इसे पारित उपयोग कर सकते हैं MyClass
का परीक्षण करने का परिप्रेक्ष्य अब आपको परवाह नहीं है कि SomeSingleton
सिंगलटन है या नहीं: आप सिंगलटन कार्यान्वयन समेत किसी भी अन्य कार्यान्वयन को भी पारित कर सकते हैं, लेकिन अधिकतर संभावना है कि आप किसी प्रकार के नकली का उपयोग करेंगे जो आप अपने नियंत्रण से करते हैं परीक्षण।
Btw, इस तरह से यह करने के लिए नहीं है:
public class MyClass
{
private SomeInterface __s = SomeSingleton.getInstance() ;
public MyClass()
{
}
...
}
कि अभी भी रन-टाइम में ही बाहर काम करता है, लेकिन परीक्षण के लिए अब आप फिर से SomeSingleton
पर निर्भर हैं।
मैं एकमात्र जो इंटरफेस के माध्यम से पहुंचा जा सकता है का उपयोग करें और उन्हें संभव के रूप में ज्यादा के रूप में राज्यविहीन बनाने के लिए प्रयास करें। यह सिंगलटन के पास होने वाली अधिकांश समस्या से बचता है (लेकिन कई मामलों में उनका उपयोग नहीं किया जाता है;) –