Junit参数化构造函数 - 参数数量错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Junit参数化构造函数 - 参数数量错误相关的知识,希望对你有一定的参考价值。

我正在尝试构建一个参数化的Junit测试,以测试LinkedHashMaps的ArrayList中每次出现的LinkedHashMap。这是因为每个LinkedHashMap代表一个测试用例。

地图由我的TestSuite类中的对象构建/存储,该类使用@BeforeClass注释,如下所示:

@RunWith(Suite.class)
public class TestSuite {

public static MapBuilder mapBuilder = new MapBuilder ();

@ClassRule
public static ExternalResource testResource = new ExternalResource();
    @Override
    protected void before () throws IOException {
    mapBuilder.buildMap();
    }
}

Mapbuilder的.buildMap()方法很昂贵,所以我不希望为每个Junit测试构建它,因此需要参数化类,如下所示:

@RunWith(Parameterized.class)
public class TestCasesA {

private LinkedHashMap<Integer, Integer> currentMap;

public TestCasesA (LinkedHashMap<Integer, Integer> currentMap) {
    this.currentMap = currentMap;
    }

@Parameters
public static Collection<Object[]> dataFeed () {
    Object[] objArray = TestSuite.MapBuilder.returnBuiltMap().toArray();
    return Arrays.asList(new Object[][] {objArray});
    }

@Test
// Some test which uses currentMap 
}

但是,当我运行这个时,我会面对以下问题:

java.lang.IllegalArgumentException:java.lang.reflect.Constructor.newInstance(Unknown Source)中的参数数量错误

我整天都在搜索Stack Overflow和其他网站,但我仍然无法解决这个问题。

不确定这是否重要但我的LinkedHashMap可能包含1到大约32个键/值条目(可能包含更多,但非常不可能)。

我在线阅读了大量的例子,你可以手动输入要返回的内容,这样可以正常工作,但手动输入并不适合我想要实现的目标。

我甚至在TestCasesB中做了一个增强的for循环,称为.returnBuiltMap()方法并打印出地图的每次迭代,以证明我的测试用例可以“看到”构建的地图。

有人可以帮忙吗?

作为参考,我使用的是Java 7和Junit 4。

答案

由于缺乏任何答案,我自己一直在进一步研究这个问题(在我原来的帖子中上传错误的代码是我的一个不好的举动)。

我终于在今天找到了答案 - @BeforeClass在@Parameters之后运行,正如在这里详细讨论的那样> https://github.com/junit-team/junit4/issues/527

上面的代码总是失败,因为我的数据设置是在@Parameters运行后执行的,所以@Parameters没有任何内容可以输入到指定的构造函数中。

另一答案

看来你忘了添加构造函数,比如:

@RunWith(Parameterized.class)
public class TestCasesA {
   private Integer paramA, paramB;

   @Parameters
   public static Collection<Object[]> data() {
      return Arrays.asList(new Object[][] { 
         { 1, 1 },
         { 2, 2 }
      });
   }

   public TestCasesA (Integer paramA, Integer paramB){
      this.paramA = paramA;
      this.paramB = paramB;
   }

   @Test
   public void testYourParams() {
      assertEquals(paramA, paramB);
   }
}

以上是关于Junit参数化构造函数 - 参数数量错误的主要内容,如果未能解决你的问题,请参考以下文章

JUnitJUnit 参数化测试

如何在 for 循环中调用参数化构造函数。

如何在java中动态实例化具有不同数量参数的java类?

使用java.lang.Exception的错误:测试类应该只有一个公共构造函数

构造函数上的 TestNG Factory、DataProvider 和 valargs 导致“java.lang.IllegalArgumentException:参数数量错误”2

正在运行的Java参数化类给出错误