当前位置: 首页 > 面试题库 >

JUnit错误-IllegalArgumentException:测试类只能具有一个构造函数

蒋茂材
2023-03-14
问题内容

单元测试对我来说是新手,而我却不明白这个错误。我有2个TestCases子类,它们在独立运行时可以正常运行,但在我的测试套件中却不能。

在测试套件(下面的AllTest类)中,前三个可以正常工作,但是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)

问题答案:

如果您使用的是JUnit4,则不应扩展类TestCase,只需@Test在测试方法之前添加注释即可。

并且您的测试套件应该这样开始:

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


 类似资料:
  • 所以我有这个错误,使用robolectric。

  • 伙计们,我是JUnit测试的新手,并试图很好地掌握它,现在我正在为一个构造函数(用于创建有向图的有向图类)编写JUnit测试,该构造函数在读取负int值时抛出IllegalArgumentExctive,如果一切正常(节点值的数量)大于零,则创建一个图。 有向图类: 下面是我试图写的测试: 我应该如何使用一个(或两个)测试用例来测试这两个用例?如果“in”没有检测到-ve值,我就得到java。否则

  • 我有一个(相当复杂的)数据类型: 现在我发现自己需要另一个数据类型…有两个构造函数。一个与的相同;另一个只存储一个。我有什么选择? 虽然这会起作用,但它也允许类似这样的东西,这是没有意义的。

  • 我试图理解右值引用。这是我迄今为止编写的代码: 输出只有< code >“hello”,这让我很困惑。 由于 是传递给第二个构造函数的临时对象,因此代码输出就好像只调用第一个构造函数一样。 我猜这要么是编译器优化,要么我错过了关于构造函数和右值的一些细节。

  • 我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这

  • Spring文档说: 每个类只能标记一个带注释的构造函数,但是可以注释多个非必需的构造函数。在这种情况下,每个都被认为是候选的,Spring使用最贪婪的构造函数,其依赖关系可以得到满足——也就是说,具有最多参数的构造函数。构造函数解析算法与具有重载构造函数的非注释类相同,只是将候选对象缩小为注释构造函数。 我测试了它,当我有另一个由 错误: 组织。springframework。豆。工厂BeanC