2012-02-23 20 views
5

Thử nghiệm đơn vị là mới đối với tôi và tôi có lỗi này mà tôi không hiểu. Tôi có 2 lớp con TestCases hoạt động tốt khi chạy độc lập, nhưng không hoạt động trong bộ thử nghiệm của tôi.Lỗi JUnit - IllegalArgumentException: Lớp kiểm tra chỉ có thể có một hàm tạo

Trong bộ thử nghiệm (lớp AllTest bên dưới), 3 công việc đầu tiên tốt, nhưng AvailableResouresTest và ModelTest tạo lỗi.

Tôi nghi ngờ có liên quan đến việc tôi phải nhập 2 lớp đó (và chỉ chúng) trong AllTest trong khi tất cả chúng đều nằm trong cùng một gói.

Tôi đã sử dụng trình hướng dẫn Eclipse để tạo hai trường hợp thử nghiệm đó. Tuy nhiên, tôi không thể tìm thấy sự khác biệt đáng chú ý trong các mã, do đó, có thể có một số mắt mới có thể giúp đỡ. Thank you very much

Mã kiểm tra bộ:

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"; 
} 

Các thử nghiệm làm việc phi:

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"); 
} 
} 

Và stack trace:

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

nó có thể có cái gì để làm với thực tế rằng bạn đang sử dụng cả hai JUnit3 và Junit4 cấu trúc? Tôi sẽ khuyên bạn không nên 'extends'ing' TestCase' ... –

Trả lời

3

Nếu bạn đang sử dụng Junit4 của bạn các lớp không nên mở rộng TestCase, bạn chỉ cần chú thích @Test trước khi bạn phương pháp st.

Và bộ kiểm tra của bạn nên bắt đầu như thế này:

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

Mã của anh ta chứa một nhập 'Suite.SuiteClasses', vì vậy không cần thiết phải cung cấp tên đủ điều kiện. –

+0

@ nicholas.hauschild Cảm ơn, đã sửa nó, vẫn không cần 'value ='. – talnicolas

+0

Lỗi của tôi rất ngu ngốc. Nó phải là lớp AvailableResourcesTest.class. Tuy nhiên câu trả lời của bạn buộc tôi phải nhìn vào nó. Cảm ơn bạn. – znat

Các vấn đề liên quan