如何将map key和value作为单独的参数传递给Junit测试

yeotifhr  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(125)

首先,我是一个java初学者,也是stacktrace的新手,所以请原谅我;).
我有一个静态Map,我的目标是将键/值对作为单独的参数传递到我的测试中。
这是我的简单Map:

Map<String, String> myMap=Map.ofEntries(
          entry("foo1", "bar1"),
          entry("foo2", "bar2"));

我想到了这样的事情:

@ParameterizedTest
@MethodSource("provideNamespaceGroupIdMapping")
void my_test(String key, String value) {

prepareFile(key);
prepareOtherStuff(value);
...
}

使用一个方法将每个条目作为单独的参数提供。所以大概是这样的:

private static Stream<Arguments> provideNamespaceGroupIdMapping() {
  return Stream.of(
    Arguments.of(
      myMap.keySet().stream().toString(), 
      myMap.values().stream().toString()));
  }

这将导致IndexOutOfBoundsException

java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1

就像我说的,我是个初学者。我尝试了一些其他的想法,但没有任何成功:)。
有没有一个解决方案,我想实现什么?

2fjabf4q

2fjabf4q1#

您没有传递实际值。您需要收集流对象,然后将列表传递给Argument.of()

private static Stream<Arguments> provideNamespaceGroupIdMapping() {
    List<String> keys = new ArrayList<>(myMap.keySet());
    List<String> values = new ArrayList<>(myMap.values());
    return IntStream.range(0, myMap.size())
            .mapToObj(i -> Arguments.of(keys.get(i), values.get(i)));
}

当您使用provideNamespaceGroupIdMapping()方法作为源运行参数化测试时,Map中的每个键值对都应该作为单独的参数传递给my_test()方法。

相关问题