2012-02-23 16 views
5

यूनिट परीक्षण मेरे लिए नया है, और मुझे यह त्रुटि है जो मुझे समझ में नहीं आती है। मेरे पास 2 टेस्टकेस उप-वर्ग हैं जो स्टैंडअलोन चलाते समय ठीक काम करते हैं, लेकिन मेरे परीक्षण सूट में नहीं।जुनीट त्रुटि - अवैध अर्ग्यूमेंट अपवाद: टेस्ट क्लास में केवल एक कन्स्ट्रक्टर हो सकता है

परीक्षण सूट (नीचे ऑलटेस्ट क्लास) में, पहला 3 काम ठीक है, लेकिन उपलब्ध रेसौर्सटेस्ट और मॉडलटेस्ट त्रुटि उत्पन्न करता है।

मुझे संदेह है कि इसे इस तथ्य के साथ करना है कि मुझे उन 2 वर्गों (और केवल उन्हें) को ऑलटेस्ट में आयात करना था, जबकि वे सभी एक ही पैकेज में स्थित हैं।

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

टेस्ट स्वीट कोड:

package com.tms.client.tests; 
import org.junit.runner.RunWith; 
import org.junit.runners.Suite; 
import org.junit.runners.Suite.SuiteClasses; 
import com.tms.client.model.AvailableResources; // I have to import those 2 classes only 
import com.tms.client.model.Model;    // but all my tests are in the same folder 

@RunWith(Suite.class) 
@SuiteClasses(value = { TaskTest.class, 
        ResourceTest.class, 
        DateForTMSTest.class, 
        AvailableResources.class, 
        Model.class}) 
public class AllTests{ 
public static final String SCHEME_FILENAME= "config/project_schema.inc2.xsd"; 
public static final String RESOURCE_FILENAME = "config/resourceList.inc2.txt"; 
public static final String PROJECT_FILENAME = "input/project.inc2.e.xml"; 
public static final String PROJECT_FILENAME_SAVE_LOCATION =  "input/project.save.tmp.xml"; 
} 

गैर काम कर परीक्षण:

package com.tms.client.tests; 
import java.util.ArrayList; 
import java.util.Hashtable; 
import junit.framework.TestCase; 
import org.junit.Before; 
import org.junit.Test; 
import com.tms.client.model.AvailableResources; 
import com.tms.client.model.Model; 
import com.tms.client.model.ParseXML; 
import com.tms.client.model.Task; 

public class AvailableResourcesTest extends TestCase{ 

ArrayList<String> stringsFromFile; 
Class<AvailableResources> dummyAR; 
Model model; 

@SuppressWarnings("unchecked") 
@Before 
public void setUp() throws Exception { 
    super.setUp(); 
    ParseXML.setSchemaFile(AllTests.SCHEME_FILENAME); 
    model = new Model(AllTests.RESOURCE_FILENAME, AllTests.PROJECT_FILENAME); 
    dummyAR = AvailableResources.class; 
    stringsFromFile = Helper.getLinesFromFile(AllTests.RESOURCE_FILENAME); 
} 

@SuppressWarnings("unchecked") 
@Test 
public void testFlushAllResources() { 
    //Get the size BEFORE flushing 
    Hashtable<Integer,Task> mapIdToObject = (Hashtable<Integer,Task>) PrivateAccessor.getPrivateFieldStatic(dummyAR, "mapIDtoName"); 
    int sizeBeforeFlush = mapIdToObject.size(); 
    // Flush tasks 
    PrivateAccessor.invokePrivateMethodStatic(dummyAR, "flushAllResources", null); 
    // Get the size AFTER flushing 
    mapIdToObject = (Hashtable<Integer,Task>) PrivateAccessor.getPrivateFieldStatic(dummyAR, "mapIDtoName"); 
    int sizeAfterFlush = mapIdToObject.size(); 
    boolean test = sizeBeforeFlush > 0 && sizeAfterFlush == 0; 
    // Add code to remove task 
    assertTrue(test);  
} 

/** 
* Compare # lines in resource file with mapIdToName.size() 
*/ 
@Test 
public void testSize() { 
    Hashtable<Integer,Task> mapIdToName = (Hashtable<Integer,Task>) PrivateAccessor.getPrivateFieldStatic(dummyAR, "mapIDtoName"); 
    assertEquals(mapIdToName.size(), stringsFromFile.size()); 
} 

/** 
* Check that every resource id from file is available in model 
*/ 
@Test 
public void testIsAvailable() { 
    for(String s: stringsFromFile){ 
     int resourceId = Integer.parseInt(s.split(";")[0]); // the resourceId from file 
     assertTrue(AvailableResources.isAvailable(resourceId)); 
    } 
} 

/** 
* Check that the name returned corresponds to the name in file 
*/ 
@Test 
public void testGetNameFromID() { 
    for(String s: stringsFromFile){ 
     int resourceId = Integer.parseInt(s.split(";")[0]); // the resourceId from file 
     String resourceName = s.split(";")[1]; // the resourceId from file 
     assertEquals(AvailableResources.getNameFromID(resourceId), resourceName); 
    } 
} 

@Test 
public void testAddNameByID() { 
    fail("Not yet implemented"); 

} 

@Test 
public void testRemoveResourceByID() { 
    fail("Not yet implemented"); 
} 
} 

और स्टैक ट्रेस: ​​

java.lang.IllegalArgumentException: Test class can only have one constructor 
at org.junit.runners.model.TestClass.<init>(TestClass.java:37) 
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:73) 
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:55) 
at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:13) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:98) 
at org.junit.runners.model.RunnerBuilder.runners(RunnerBuilder.java:84) 
at org.junit.runners.Suite.<init>(Suite.java:101) 
at org.junit.runners.Suite.<init>(Suite.java:67) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35) 
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) 
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
+3

यह तथ्य यह है कि आप उपयोग कर रहे दोनों JUnit3 और JUnit4 निर्माणों के साथ कुछ हो सकता है? मैं 'टेस्टकेस' को 'विस्तारित' नहीं करने की अनुशंसा करता हूं ... –

उत्तर

3

आप उपयोग कर रहे हैं JUnit4 अपने कक्षाओं को TestCase का विस्तार नहीं करना चाहिए, आपको अपने टी से पहले @Test एनोटेशन की आवश्यकता है सेंट विधियों।

और अपने टेस्ट स्वीट इस तरह शुरू करना चाहिए:

@RunWith(Suite.class) 
@SuiteClasses({TaskTest.class, 
       ResourceTest.class, 
       DateForTMSTest.class, 
       AvailableResources.class, 
       Model.class}) 
+0

उनके कोड में 'Suite.SuiteClasses' का आयात शामिल है, इसलिए योग्य नाम प्रदान करना आवश्यक नहीं है। –

+0

@ निकोलस.hauschild धन्यवाद, इसे ठीक किया गया है, अभी भी 'value =' की आवश्यकता नहीं है। – talnicolas

+0

मेरी त्रुटि बहुत बेवकूफ थी। यह उपलब्ध होना चाहिए स्रोत स्रोत। क्लास। हालांकि आपके जवाब ने मुझे एक और नजर डालने के लिए मजबूर किया। धन्यवाद। – znat

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