我正在尝试构建一个参数化的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.
答案 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);
}
}