我正在测试一个采用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
跑步者已经知道如何创建数据点的笛卡尔积,是否有比我使用的更简洁的方法来填充由这些产品组成的集合? / p>