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

时间:2018-02-27 21:03:51

标签: java 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(未知来源)中的参数数量错误

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

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

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

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

有人可以帮忙吗?

供参考,我使用的是Java 7和Junit 4.

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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);
   }
}