2010-08-16 10 views
6

मैंने कुछ भी गोपनीय खुलासा किए बिना इसे चित्रित करने के लिए एक नकली उदाहरण लिखा था। यह एक "डमी" उदाहरण है जो कुछ भी नहीं करता है, लेकिन परीक्षण प्रारंभकर्ता में समस्या होती है।मैं एक varargs कन्स्ट्रक्टर के साथ एक जुनीट पैरामीटरेटेड धावक का उपयोग कैसे करूं?

@RunWith(Parameterized.class) 
public class ExampleParamTest 
{ 
int ordinal; 
List<String> strings; 

public ExampleParamTest(int ordinal, String... strings) 
{ 
    this.ordinal = ordinal; 
    if (strings.length == 0) 
    { 
    this.strings = null; 
    } 
    else 
    { 
    this.strings = Arrays.asList(strings); 
    } 
} 

@Parameters 
public static Collection<Object[]> data() { 
    return Arrays.asList(new Object[][] { 
    {0, "hello", "goodbye"}, 
    {1, "farewell"} 
    }); 
} 

@Test 
public void doTest() { 
    Assert.assertTrue(true); 
} 
} 

मूल रूप से मैं एक परीक्षण निर्माता जो एक स्थानीय सूची चर के लिए कई तर्क को स्वीकार करता है और मैं एक सरणी initialiser के माध्यम से इस को भरने के लिए चाहते हैं। परीक्षण विधि स्थानीय सूची चर को सही तरीके से संभाल लेगी - मैंने परीक्षण को सरल बनाने के लिए इस तर्क को हटा दिया है।

जब मैं इसे लिखता हूं, तो मेरे आईडीई में सिंटैक्स के बारे में कोई शिकायत नहीं होती है और टेस्ट क्लास किसी भी संकलन त्रुटियों के बिना बनाता है। लेकिन जब मैं इसे चलाने के लिए, मैं:

doTest[0]: 
java.lang.IllegalArgumentException: wrong number of arguments 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 
doTest[1]: 
java.lang.IllegalArgumentException: argument type mismatch 
    at java.lang.reflect.Constructor.newInstance(Unknown Source) 

वास्तव में क्या गलत यहाँ चला गया है, और कैसे मैं सही ढंग से इस पद्धति का उपयोग करते हैं?

+0

क्या करना है और यह किस डेटा में है? – Jes

+0

इस उदाहरण में, डूटेस्ट सिर्फ एक डमी टेस्ट है जो इस परीक्षण को ज्यूनिट में निष्पादित करने की अनुमति देता है। समस्या परीक्षण कोड में नहीं है, जैसा कि आप देखेंगे कि जब आप इस परीक्षण को चलाने के लिए प्रयास करते हैं तो यह खड़ा होगा; इस तथ्य के बावजूद कि इसमें लगभग खाली परीक्षण निकाय है, यह अभी भी उपरोक्त प्रारंभिक त्रुटि के कारण चलाने में विफल रहता है। – Kidburla

+0

मैंने स्टैकट्रैक का एक हिस्सा जोड़ा जो मुझे लगता है कि जब मैं यह जांचने के लिए अपना परीक्षण चलाता हूं कि त्रुटि तब हो रही है जब varargs कन्स्ट्रक्टर का आह्वान किया जाता है। यदि आप जो देख रहे हैं उससे अलग है, तो इसे बदलने या इसे वापस करने के लिए स्वतंत्र महसूस करें। –

उत्तर

11

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

अगर मैं सही हूँ, तो यह काम करना चाहिए:

@Parameters 
public static Collection<Object[]> data() { 
    return Arrays.asList(new Object[][] { 
    {0, new String[]{"hello", "goodbye"}}, 
    {1, new String[]{"farewell"}} 
    }); 
} 

कुछ स्पष्टीकरण

स्रोत कोड के स्तर पर, हम

test = ExampleParamTest(0, "one", "two"); 

लिख सकते हैं संकलक परिवर्तित कर देंगे स्ट्रिंग्स की एक सरणी के लिए। JUnit प्रतिबिंब और मंगलाचरण API का उपयोग करता है, और इस दृष्टिकोण से, कंस्ट्रक्टर्स हस्ताक्षर

public ExampleParamTest(int i, String[] strings); 

तो निर्माता को लागू करने की है - और कि JUnit आंतरिक रूप से क्या कर रहा है है - आप एक पूर्णांक और एक स्ट्रिंग सरणी पारित करने के लिए की है।

+0

मैंने कोशिश की, यह काम करता है। –

+0

आप सही हैं, यह काम किया है। लेकिन यह सार्वभौमिक रूप से सच नहीं है। आम तौर पर, मैं कुछ लिख सकता था: myTest = new exampleParamTest (0, "हैलो", "अलविदा"); यह परिवर्तनीय तर्क विधियों का पूरा बिंदु है। फिर यह मेरे उदाहरण में क्यों काम नहीं करता है? – Kidburla

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

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