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

问题描述 投票:0回答:2

我正在尝试构建一个参数化的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。

java junit
2个回答
1
投票

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

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

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


0
投票

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

@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);
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.