2009-09-20 12 views
11

मेरे पास एक परीक्षण कक्षा है, जो जुनीट 4 सिंटैक्स में लिखी गई है, जिसे बिना किसी विफलता के "जूनिट टेस्ट के रूप में चलाएं" विकल्प के साथ ग्रहण में चलाया जा सकता है। जब मैं एक चींटी लक्ष्य के माध्यम से एक ही परीक्षण चलाने मैं इस त्रुटि मिलती है:क्या जुनीट 4 टेस्टक्लास के लिए सार्वजनिक कोई तर्क कन्स्ट्रक्टर की आवश्यकता नहीं है?

java.lang.Exception: Test class should have public zero-argument constructor 
at org.junit.internal.runners.MethodValidator.validateNoArgConstructor(MethodValidator.java:54) 
at org.junit.internal.runners.MethodValidator.validateAllMethods(MethodValidator.java:39) 
at org.junit.internal.runners.TestClassRunner.validate(TestClassRunner.java:33) 
at org.junit.internal.runners.TestClassRunner.<init>(TestClassRunner.java:27) 
at org.junit.internal.runners.TestClassRunner.<init>(TestClassRunner.java:20) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26) 
at junit.framework.JUnit4TestAdapter.<init>(JUnit4TestAdapter.java:24) 
at junit.framework.JUnit4TestAdapter.<init>(JUnit4TestAdapter.java:17) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:386) 
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:911) 
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:768) 
Caused by: java.lang.NoSuchMethodException: dk.gensam.gaia.business.bonusregulering.TestBonusregulerAftale$Test1Reader.<init>() 
at java.lang.Class.getConstructor0(Class.java:2706) 
at java.lang.Class.getConstructor(Class.java:1657) 
at org.junit.internal.runners.MethodValidator.validateNoArgConstructor(MethodValidator.java:52) 

मैं कक्षा में कोई सार्वजनिक कोई आर्ग निर्माता है, लेकिन यह वास्तव में आवश्यक है?

यह मेरा चींटी लक्ष्य

<target name="junit" description="Execute unit tests" depends="compile, jar-test"> 
     <delete dir="tmp/rawtestoutput"/> 
     <delete dir="test-reports"/> 
     <mkdir dir="tmp/rawtestoutput"/> 
     <junit printsummary="true" failureproperty="junit.failure" fork="true"> 
      <classpath refid="class.path.test"/> 
      <classpath refid="class.path.model"/> 
      <classpath refid="class.path.gui"/> 
      <classpath refid="class.path.jfreereport"/> 
      <classpath path="tmp/${test.jar}"></classpath> 
      <batchtest todir="tmp/rawtestoutput"> 
      <fileset dir="${build}/test"> 
       <include name="**/*Test.class" /> 
       <include name="**/Test*.class" /> 
      </fileset> 
      </batchtest> 
     </junit> 
     <junitreport todir="tmp"> 
      <fileset dir="tmp/rawtestoutput"/> 
      <report todir="test-reports"/> 
     </junitreport> 
     <fail if="junit. 
failure" message="Unit test(s) failed. See reports!"/> 
    </target> 

परीक्षण वर्ग कोई कंस्ट्रक्टर्स है है, लेकिन यह डिफ़ॉल्ट संशोधक के साथ एक आंतरिक वर्ग है। इसमें एक अनामिक भीतरी कक्षा है। दोनों आंतरिक कक्षाएं "टेस्ट क्लास में सार्वजनिक शून्य-तर्क कन्स्ट्रक्टर त्रुटि होनी चाहिए"। मैं चींटी संस्करण 1.7.1 का उपयोग कर रहा हूं और जुनीट 4.7

उत्तर

3

आपके समय और आपके उत्तरों के लिए धन्यवाद। अब मुझे एक समाधान मिला है। पहले मैंने सोचा था कि मेरे चींटी लक्ष्य के बैचटेस्ट हिस्से के लिए इनपुट .class फ़ाइलों होना चाहिए, लेकिन .java फ़ाइलों का उपयोग करना भी संभव है।

इससे समस्या हल हो गई। अब यह सार्वजनिक कन्स्ट्रक्टर गायब आंतरिक कक्षाओं के बारे में शिकायत नहीं करता है।

<target name="junit" description="Execute unit tests"> 
<delete dir="tmp/rawtestoutput"/> 
<delete dir="test-reports"/> 
    <mkdir dir="tmp/rawtestoutput"/>  
    <junit printsummary="on" failureproperty="junit.failure" fork="true"> 
     <jvmarg value="-Duser=TBA -Dpassword=ibber11"/> 
     <classpath refid="class.path.test"/> 
     <classpath refid="class.path.model"/> 
     <classpath refid="class.path.gui"/> 
     <classpath refid="class.path.jfreereport"/> 
    <classpath path="tmp/${test.jar}"/> 
     <batchtest todir="tmp/rawtestoutput"> 
     <fileset dir="src/test"> 
      <include name="**/*.java"/> 
     <exclude name="**/SessionHelper.java"/> 
     <exclude name="**/TestHelper.java"/> 
     </fileset> 
     </batchtest> 
    <sysproperty key="user" value="tba"/> 
    <sysproperty key="password" value="ibber11"/> 
    </junit> 
    <junitreport todir="tmp"> 
     <fileset dir="tmp/rawtestoutput"/> 
     <report todir="test-reports"/> 
    </junitreport> 
    <fail if="junit.failure" message="Unit test(s) failed. See reports!"/> 
</target> 

मेरी केवल समस्या अब है, मैं परीक्षण के बिना परीक्षण वर्गों को फिल्टर करने के लिए एक "कोई runnable तरीकों" -त्रुटि से बचने के लिए, है। यही है, सहायक और उपयोग वर्ग।

मेरा से अधिक सुरुचिपूर्ण समाधान होना चाहिए। एक समाधान एक नामकरण सम्मेलन हो सकता है जैसा कि सुझाव दिया गया है [JUnit: how to avoid "no runnable methods" in test utils classes

सहायक कक्षाओं में @ टेस्ट एनोटेशन नहीं होता है। इसे किसी भी तरीके से उपयोग करना संभव है ...

+0

**/* Helper.java को बाहर करने का प्रयास करें। –

1

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

लेकिन आप कृत्रिम नो-Arg कन्स्ट्रक्टर को दबाने क्यों देंगे?

1

करने के बाद नो-आर्ग निर्माता परीक्षण कक्षाओं सुइट्स में एकत्रित की अनुमति देता है:

TestSuite suite = new TestSuite(); 
suite.add(TestClass.class); 
... 
8

मेरा मानना ​​है कि यदि आप एक नहीं args निर्माता की जरूरत है, लेकिन अगर आप किसी भी कंस्ट्रक्टर्स नहीं घोषित करते जावा एक कृत्रिम पैदा करेगा आपके लिए एक। क्या आप सुनिश्चित हैं कि चींटी-कार्य एक और वर्ग नहीं उठा रहा है; एक जो आपके द्वारा सेट किए गए नामकरण सम्मेलन का पालन करने के लिए होता है (*Test या Test*)?

5

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

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

5

ग्रहण JUnit4 परीक्षण मामलों को निष्पादित करने के लिए एक अलग कार्यान्वयन का उपयोग करता है - इसका अपना परीक्षण धावक है। यह चींटी द्वारा उपयोग किए जाने वाले एक से भिन्न होता है - डिफ़ॉल्ट जो जुनीट वितरण में उपलब्ध होता है, और यह चींटी और ग्रहण के वातावरण के निष्पादन व्यवहार में उल्लिखित विसंगति का कारण है।

जुनीट 4.3.1, 4.5 और 4.7 (विशेष रूप से परीक्षकों के) के स्रोत कोड पर एक नज़र डालने से पता चलता है कि परीक्षण कक्षाओं में सार्वजनिक शून्य-तर्क निर्माता होना चाहिए। ध्यान दें कि जुनीट v4.7 में डिफ़ॉल्ट धावक BlockJUnit4ClassRunner है। आप देखेंगे कि javadocs (क्या करुणा!) में नियमों का पालन किया जाता है जो कि एक अच्छी तरह से गठित परीक्षण वर्ग का गठन करता है - एक सार्वजनिक शून्य-तर्क कन्स्ट्रक्टर उनमें से एक है।

+0

मैं तुम्हें के रूप में ही सोच रहा था। यह जूनिट 3 बनाम जूनिट 4 के साथ कुछ करने के लिए था, लेकिन जहां तक ​​मैं स्टैकट्रैस में देख सकता हूं, यह वास्तव में एक जुनीट 4 टेस्ट एडाप्टर शामिल है। –

+0

ठीक है, मैंने चींटी 1.7.1 के स्रोतों पर एक नज़र डाली। JUnitTestRunner.java (लाइन 386 जो स्टैक ट्रेस में दिखाई देता है) में एक टेस्टसूइट इंस्टेंस बनाया जाता है, केवल तभी पूर्व शर्त पूरी होती है। –

+0

मेरी बुराई, लाइन 3 9 6 टेस्टसुइट बनाता है जबकि 386 JUnit4TestAdapter बनाता है। –

0

गैर स्थैतिक आंतरिक कक्षाओं में एक छिपी हुई रचनाकार है जो बाहरी वर्ग को तर्क के रूप में लेता है। यदि आपकी आंतरिक कक्षा बाहरी कक्षाओं के साथ राज्य साझा नहीं करती है, तो बस उन्हें static बनाएं।

1

जूनिट के पुराने संस्करणों के लिए, यदि आपके पास अपनी आंतरिक कक्षा में "टेस्ट" शब्द है, तो यह समस्या होगी।

सबक्लास-के-टेस्ट पैटर्न को लागू करते समय हम इस समस्या में भाग गए, उपclass नामकरण, उदाहरण के लिए, FooForTest। FooSubclass में नाम बदलकर, समस्या हल हो गई थी।

प्रभावित जूनिट संस्करणों के बारे में अधिक जानकारी के लिए @ विनीत रेनॉल्ड्स से उपरोक्त टिप्पणी देखें, और यह चींटी के लिए क्यों होता है लेकिन ग्रहण नहीं करता है।

आशा है कि मदद करता है!

0

क्योंकि आप, Enclosed.class उपयोग कर रहे हैं तो संलग्न वर्गों है होना करने के लिए हो सकता है स्थिर

@RunWith(Enclosed.class) 
public class MyClassThatCointaintTestClasses { 
    public static class Class1Test { 
@Test 
public void test1(){ 
} 
@Test 
public void test2(){ 
} 
} 

public static class Class2Test { 
@Test 
public void test21(){ 
} 
@Test 
public void test22(){ 
} 
} 

}

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

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