2010-12-22 18 views
40

मैं ग्रहण के लिए एम्मा प्लगइन एक्लेमा चला रहा हूं, और कवरेज रिपोर्ट एनम के लिए केवल आंशिक कवरेज दिखाती है, भले ही यह एनम में कवर होने के समान मूल्य दिखाती है। मुझे लगता है कि एनम वापस आने वाली विधियों के लिए एक कवरेज अंतर है, लेकिन मुझे पूरा यकीन नहीं है।एनम प्रकारों पर एम्मा कवरेज

उदाहरण के लिए, इस Enum साथ, EclEmma सब कुछ हरे रंग में प्रकाश डाला गया है, पैकेज घोषणा के अलावा:

package com.blah; 

public enum UserRole { 
HAS_ACCESS 
} 

अगर मैं वर्ग के लिए कवरेज विवरण प्राप्त कर लेते हैं मैं इस देखें:

alt text

मेरा सवाल है, ईक्लेमा का उपयोग करके अपने एनम कक्षाओं पर 100% कवरेज प्राप्त करने का सबसे अच्छा तरीका क्या है?

+0

क्या एम्मा आपको जो याद आती है उसके बारे में ब्योरा नहीं देती है? ऐसा लगता है कि अजीब लगता है। –

+0

मेरे 2 सेंट जैसा कि मैंने पहले वहां किया है और मैंने अपने डेवलपर्स को इस जाल में गिरने को देखा है। ऐसा लगता है कि 100% कोड कवरेज तक पहुंचने पर आप अधिक भावुक (वांछित से) हैं। यह सिर्फ समय बर्बाद है। कवरेज टूल रिपोर्ट का उपयोग कोड सुधार अवसरों (या तकनीकी विभाग को कम करने) की पहचान करने के लिए किया जाना चाहिए और इसे उचित सुधार के रूप में नहीं देखा जाना चाहिए। –

+0

मैं सहमत हूं, लेकिन यदि कवरेज प्राप्त करने का एक आसान तरीका है, तो मैं इसे अनदेखा नहीं कर रहा हूं। यह कवरेज रिपोर्ट पर शोर है कि मुझे वास्तविक मुद्दों पर जाने के लिए फ़िल्टर करना नहीं होगा। मुझे लगता है कि यह कोई संकलक चेतावनी नहीं है। मुझे उन सभी को ठीक करने के लिए * नहीं है, लेकिन मैं कम महत्वपूर्ण लोगों के माध्यम से फ़िल्टर नहीं करना चाहता हूं यह देखने के लिए कि मेरे पास एक नया है जो बहुत महत्वपूर्ण है। बीटीडब्ल्यू, आपका उत्तर एक गैर-उत्तर है और एक टिप्पणी के रूप में बेहतर रखा गया होगा। –

उत्तर

51

जो आप देख रहे हैं वह कुछ छिपे हुए बाइटकोड को गणना के कारण उत्पन्न किया जा रहा है।

इस समस्या से छुटकारा पाने के लिए, एनरम में मानों() और valueOf() विधियों को कॉल करें, जैसा कि पहले कार्ल मैनस्टर और पीटर लॉरी ने उल्लेख किया था।

+11

मैंने पाया कि मुझे बस इतना करना था कि मूल्य के लिए एक ही कॉल करें और मुझे 100% कवरेज मिलता है। मैंने सोचा कि मुझे उससे ज्यादा करना होगा। –

+0

मुझे 'एनम' और' कक्षाओं 'के साथ एक ही समस्या का सामना करना पड़ रहा था। मैं 'enum' के मामले में हल करने में सक्षम था। लेकिन मेरा कोड कवरेज 'पैकेज' नाम पर कवर नहीं है। कोई सुझाव उपयोगी होगा – Amolb

+0

@Amolb आपकी सबसे अच्छी शर्त सभी प्रासंगिक विवरणों के साथ एक नया प्रश्न पूछना है। यह स्पष्ट रूप से 'enum ', पैकेज नहीं' के बारे में था। – deterb

2

हम एक समान मुद्दे में भाग गए जहां गणनाओं पर संकलक उत्पन्न विधियों, जैसे मान(), आमतौर पर हमारे परीक्षण कोड में नहीं कहा जा रहा था। हमने अपनी अंतिम रिपोर्ट से हमारी enum वस्तुओं की संख्या को फ़िल्टर करके समस्या के आसपास काम किया।

यही कारण है कि मुझे पूर्णता के उपाय के रूप में कोड कवरेज का उपयोग करना पसंद नहीं है। जब मैं एक बेहतर मीट्रिक के बारे में सोचता हूं, तो मैं आपको बता दूंगा। :)

+3

इस से छुटकारा पा रहा है: शायद आप एक सामान्य परीक्षा विधि लिख सकते हैं जो किसी भी गणना लेता है और परीक्षण रिपोर्ट शोर से छुटकारा पाने के लिए अपने सहज तरीके से अभ्यास करता है। यह थोड़ा जोखिम भरा है - अगर आपने यह सब कुछ किया है, तो आपके पास 100% परीक्षण कवरेज होगा और कोई परीक्षण मूल्य नहीं होगा - लेकिन मुझे लगता है कि यह आपकी आवश्यकताओं को पूरा कर सकता है। –

+2

आप एक जेनेरिक एनम व्यायामकर्ता जोड़ सकते हैं जो मूल्य() और valueOf() को कॉल करता है जिसे आप व्यायाम एनीम (MyEnum.class) –

+1

के साथ कॉल कर सकते हैं प्रतिक्रिया के लिए धन्यवाद। आप कवरेज अंतर के कारण के बारे में सही हैं, लेकिन मुझे नहीं लगता कि कवरेज रिपोर्ट से एम्स को अनदेखा करना सही तरीका है। –

9

मैं अन्य पोस्टरों से सहमत हूं कि 100% कोड कवरेज को गुमराह किया जा सकता है। लेकिन मुझे नए लिखित कोर कोड पर 100% कवरेज प्राप्त करने की संतुष्टि को स्वीकार करना होगा।

सौभाग्य से सभी enums एक ही 'वर्ग' का विस्तार करते हैं, तो आप अपने मित्र प्रतिबिंब से थोड़ी मदद के साथ अपने 100% प्राप्त कर सकते हैं।

पैरामीटर के रूप में [EnumTypeName] .class का उपयोग करके अपने परीक्षकों को कॉल करने के लिए बस कक्षा में निम्नलिखित स्थिर विधि जोड़ें।

Shared.superficialEnumCodeCoverage(UserRole.class); 

कुंजी शब्द 'सतही' है:

public static void superficialEnumCodeCoverage(Class<? extends Enum<?>> enumClass) { 
    try { 
     for (Object o : (Object[])enumClass.getMethod("values").invoke(null)) { 
     enumClass.getMethod("valueOf", String.class).invoke(null, o.toString()); 
     } 
    } 
    catch (Throwable e) { 
     throw new RuntimeException(e); 
    } 
    } 

इस स्थैतिक समारोह मान लिया जाये कि एक वर्ग बुलाया "साझा" में लागू किया गया था, आप केवल प्रत्येक enum के लिए इस लाइन को शामिल करने की आवश्यकता होगी।

+5

प्रतिबिंब सबसे खराब दोस्त है। एक बैकस्टैबर –

+2

यह केवल तभी काम करता है जब 'toString' विधि enum class में ओवरराइड नहीं है। उस स्थिति में, आपको इसके बजाय '.name' कॉल करना होगा (जो कि एनम प्रकार (या कम से कम प्रकार के 'एनम ') के' ओ 'होना आवश्यक है। –

+0

यदि enum में कोई फ़ील्ड नहीं है , कवरेज अभी भी अधूरा है – datahaki

संबंधित मुद्दे