2012-02-23 86 views
5

單元測試對我來說是新手,我有這個錯誤我不明白。 我有2個TestCases子類在單獨運行時工作正常,但不在我的測試套件中。JUnit錯誤 - IllegalArgumentException:測試類只能有一個構造函數

在測試套件(AllTest類下面)中,前3個工作正常,但AvailableResouresTest和ModelTest產生錯誤。

我懷疑它與我必須在AllTest中導入這兩個類(並且只有它們)的事實有關,而它們都位於相同的包中。

我使用Eclipse嚮導來創建這兩個測試用例。但是,我在代碼中找不到明顯的差異,所以可能會有一些新鮮的眼光可以提供幫助。非常感謝您

測試套件代碼:

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結構?我建議不要'擴展'TestCase' ... – 2012-02-23 14:52:07

回答

3

如果您正在使用JUnit4您班級不應該延伸TestCase,你只需要在你的te之前註釋@Test st方法。

而且測試套件應該開始像這樣:

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

他的代碼包含'Suite.SuiteClasses'的導入,因此不需要提供合格的名稱。 – 2012-02-23 15:23:19

+0

@ nicholas.hauschild謝謝,修正它,仍然不需要'value ='。 – talnicolas 2012-02-23 15:25:39

+0

我的錯誤是非常愚蠢的。它應該是AvailableResourcesTest.class。然而,你的回答迫使我再看看它。謝謝。 – znat 2012-02-23 15:34:35

相關問題