0

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

4

0 回答 0