我正在测试一种采用List
参数的方法。例如:
public String foo(List<String> list) {
return list.contains("A") ? "OK" : "Failed";
}
我正在使用 JUnit 4 Theories 从一小组潜在元素中测试每个可能的列表,最长可达三个:
@RunWith(Theories.class)
public class TestFoo {
@DataPoints
public static List<String> potentialElements() {
return Arrays.asList(null, "A", "B");
}
@Theory
public void foo_returns_OK_when_list_contains_A(
String val1, String val2, String val3) {
List<String> list = Stream.of(val1, val2, val3)
.filter( x -> x != null)
.collect(Collectors.toList());
assumeThat(list, hasItem("A"));
assertThat(foo(list), is("OK"));
}
}
这可行,但感觉有点像解决方法。val1,val2,val3
有点代码味道。如果我想用更长的列表进行测试,它很快就会变得非常笨拙。
我希望能够将我的理论写成:
@Theory
public void foo_returns_OK_when_list_contains_A(List<String> list) {
assumeThat(list, hasItem("A"));
assertThat(foo(list), is("OK"));
}
(也许有一些注释)
当然,我知道我可以编写自己的ParameterSupplier
,这将构建一个List<List<String>>
- 这将需要生成所有可能的组合。我不需要解释如何做到这一点的答案。
我想知道的是,由于Theories
跑步者已经知道如何创建数据点的笛卡尔积,有没有比我用过的更简洁的方法来填充由这些产品组成的集合?