java - JUnit परीक्षण चलते समय स्थिर क्लास इनिशियलाइज़ नहीं किया गया




static initialization (2)

मेरे पास कुछ स्थिर फ़ील्ड के साथ जावा क्लास है:

private static final PDMapCacheDAO REST_CACHE_DAO = 
    new PDMapCacheDAOImpl( Constants.REST_CACHE_NAME );

private static final PDMapCacheDAO HOLIDAYS_CACHE_DAO = 
    new PDMapCacheDAOImpl( Constants.HOLIDAYS_CACHE_NAME );

private static final String[] DATE_ARRAY = { "D", "0", "1", "2", "3", "C" };

और JUnit परीक्षण mks कि REST_CACHE_DAO और HOLIDAYS_CACHE_DAO के लिए आरंभीकरण व्यवहार:

final PDMapCacheDAOImpl holidaysMapCacheDAOImpl = mock(PDMapCacheDAOImpl.class);
final PDMapCacheDAOImpl restMapCacheDAOImpl = mock(PDMapCacheDAOImpl.class);

whenNew(PDMapCacheDAOImpl.class).withArguments(Constants.HOLIDAYS_CACHE_NAME).thenReturn(holidaysMapCacheDAOImpl);
whenNew(PDMapCacheDAOImpl.class).withArguments(Constants.REST_CACHE_NAME).thenReturn(restMapCacheDAOImpl);

जब परीक्षाओं को व्यक्तिगत तौर पर निष्पादित किया जाता है, तो परीक्षा में अपेक्षित रूप से प्रदर्शन किया जाता है, लेकिन जब सभी ज्युनिट परीक्षणों को एक साथ निष्पादित किया जाता है (जावा प्रोजेक्ट से रन - जेनेट टेस्ट से) परीक्षा में एक रिक्त संकेतक अपवाद देता है।

मैंने कुछ डिबगिंग किया है और मैंने पाया है कि समस्या (जैसा कि शीर्षक में बताया गया है) कि स्थैतिक कक्षाओं को आरम्भ नहीं किया जाता है - जब स्थैतिक तरीकों को REST_CACHE_DAO और HOLIDAYS_CACHE_DAO लागू होते हैं तो शून्य होते हैं। PDMapCacheDAOImpl के कंस्ट्रक्टर का उपयोग नहीं किया जाता है और नकली इंजेक्शन नहीं होते हैं, इसलिए जब हम उनका उपयोग करते हैं, तो यह एक एनपीई देता है।

मैंने परीक्षण करने के लिए कुछ औजारों के बारे में पढ़ा है, जैसे ईकलमा के पास यह त्रुटि (कुछ स्थैतिक कक्षाओं को आरम्भ नहीं किया गया है)। इस मामले में समाधान -f विकल्प को शामिल करना है

ईक्लेममा वेबसाइट इस समस्या के बारे में बताती है: "

2.8। ईएमएमए द्वारा परिभाषित वर्ग कवरेज कैसे है? सबसे पहले, एक कक्षा को कवरेज के लिए भी विचार करने के लिए निष्पादन योग्य माना जाना चाहिए। एक एक्जिक्युटेबल क्लास को कवर किया गया माना जाता है अगर यह जेवीएम द्वारा लोड और आरंभ किया गया है। क्लास इनिशियलाइजेशन का मतलब है कि क्लास स्टैटिक कन्स्ट्रक्टर (यदि कोई हो) को निष्पादित किया गया है। ध्यान दें कि एक क्लास को कवर किया जा सकता है, भले ही इसके किसी अन्य तरीके को निष्पादित नहीं किया गया है। जब आप बिना ई-एफ विकल्प के उपयोग के लिए emmarun का उपयोग करते हैं, तो थोड़ी सी भरी हुई लेकिन बिना आरंभिक वर्गों को देखना आम है ईएमएमए क्लास कवरेज की रिपोर्ट करता है ताकि आप उन कक्षाओं को खोज सकें जो आपके परीक्षण सूट द्वारा "छुआ" नहीं लगते हैं: ये या तो मृत कोड हो सकते हैं या अधिक परीक्षण ध्यान देने की आवश्यकता हो सकती है।

दिलचस्प बात यह है कि हम एक्लेममा का उपयोग नहीं कर रहे हैं, हम कोबर्टुरा का उपयोग कर रहे हैं, लेकिन व्यवहार और त्रुटियां समान हैं।

क्या किसी को कोबर्टुरा में इस त्रुटि के बारे में कुछ पता है और इसे कैसे हल करना है? (या तो कोबर्टुरा में या सामान्य तरीके से)?


अंत में हमने सिंगलटन का उपयोग करने का फैसला किया है और स्थैतिक आरंभीकरण के साथ सभी समस्याओं से बचने का फैसला किया है। मुझे निगम से यह कहना होगा कि समस्या बनी हुई है और भविष्य में फिर से हो सकती है, लेकिन मैं इसे ठीक करने के लिए एसक्यूए टीम की प्रतीक्षा नहीं कर सकता।

आपके सभी प्रतिक्रियाओं और आपके समय के लिए धन्यवाद


यह सट्टा है

मुझे लगता है कि PDMapCacheDAO एक अंतरफलक / सार वर्ग है, जो कुछ स्थिरांकों के लिए PDMapCacheDAOImpl का उपयोग करता है।

और ग्रेड PDMapCacheDAOImpl लागू / PDMapCacheDAO विस्तारित PDMapCacheDAO । सही?

जैसा कि मुझे यह तकनीकी रूप से बदसूरत समाधान (रिसीप्रोक निर्भरता) मिल रहा है, इन स्थिरांकों के साथ एक अलग इंटरफ़ेस PDMapCacheDAOs

इससे समस्या हल हो सकती है





cobertura