जावा के लिए मेरा आदर्श वाक्य है "सिर्फ इसलिए कि जावा में स्थिर ब्लॉक हैं, इसका मतलब यह नहीं है कि आपको उनका उपयोग करना चाहिए।" चुटकुले चुटकुले, जावा में बहुत सारी चालें हैं जो एक दुःस्वप्न का परीक्षण करती हैं। मैं सबसे ज्यादा नफरत करता हूं बेनामी क्लासेस और स्टेटिक ब्लॉक हैं। हमारे पास बहुत सारे विरासत कोड हैं जो स्टेटिक ब्लॉक का उपयोग करते हैं और ये यूनिट परीक्षणों में हमारे धक्का में कष्टप्रद बिंदुओं में से एक हैं। हमारा लक्ष्य कक्षाओं के लिए यूनिट परीक्षण लिखने में सक्षम होना है जो कम से कम कोड परिवर्तनों के साथ इस स्थिर प्रारंभिक पर निर्भर करते हैं।जावा में मॉकिंग स्टेटिक ब्लॉक
अब तक मेरे सहयोगियों के लिए मेरा सुझाव स्थिर ब्लॉक के शरीर को एक निजी स्थैतिक विधि में स्थानांतरित करना है और इसे staticInit
पर कॉल करना है। इस विधि को स्थिर ब्लॉक के भीतर से बुलाया जा सकता है। यूनिट परीक्षण के लिए एक और कक्षा जो इस कक्षा पर निर्भर करती है, आसानी से staticInit
को जेमॉकिट के साथ कुछ भी करने के लिए नकल कर सकती है। चलिए इसे उदाहरण में देखते हैं।
public class ClassWithStaticInit {
static {
System.out.println("static initializer.");
}
}
public class ClassWithStaticInit {
static {
staticInit();
}
private static void staticInit() {
System.out.println("static initialized.");
}
}
करने के लिए बदल दिया जाएगा, ताकि हम एक JUnit में निम्न कर सकते हैं।
public class DependentClassTest {
public static class MockClassWithStaticInit {
public static void staticInit() {
}
}
@BeforeClass
public static void setUpBeforeClass() {
Mockit.redefineMethods(ClassWithStaticInit.class, MockClassWithStaticInit.class);
}
}
हालांकि यह समाधान भी अपनी समस्याओं के साथ आता है। आप उसी JVM पर DependentClassTest
और ClassWithStaticInitTest
नहीं चला सकते हैं क्योंकि आप वास्तव में स्थिर ब्लॉक को ClassWithStaticInitTest
के लिए चलाने के लिए चाहते हैं।
इस कार्य को पूरा करने का आपका तरीका क्या होगा? या कोई बेहतर, गैर-जेमॉकिट आधारित समाधान जो आपको लगता है कि क्लीनर काम करेगा?
आप EasyMock के साथ 'स्थिर 'या' निजी 'विधियों का नकल नहीं कर सकते हैं। स्थैतिक प्रारंभकर्ता के शरीर को स्थानांतरित करना एक रिफैक्टरिंग तक है जो हम अभी कर सकते हैं। –
यदि परीक्षण के तहत कक्षा में स्थिर init/निजी विधि है, तो आप इसे कॉल करना चाहते हैं। कोई बात नहीं। लेकिन अगर यह वर्ग मजाक कर रहा है, तो आसान मॉक के लिए कोई समस्या नहीं है: इसे कोई कॉल नहीं किया जाएगा क्योंकि कोई कार्यान्वयन नहीं है। आप सार्वजनिक इंटरफेस को सुरक्षित रूप से नकल कर सकते हैं जैसे कि निजी सामान मौजूद नहीं था। –