首页 > 解决方案 > 在 JUnit 5 测试方法中输入多个参数

问题描述

我想为我的代码库提供“多态”测试用例。具体来说,一个接口将有多个实现,Graph并且希望为所有这些实现重用测试代码(ALGraph, AMGraph, ...)。

我想按照以下思路开发我的测试方法

    @ParameterizedTest
    @MethodSource("graphFactory")
    // Note: JUnit 5 won't allow the following additional argument source
    @ValueSource(ints = {0, 31415, -31415})
    void testInsertDeleteNode(Graph g, Integer v) {
        g.insertNode(new Node<>(v));
        assertTrue(g.containsNode(new Node<>(v)));
        assertEquals(1, g.vertices().size());

        g.deleteNode(new Node<>(v));
        assertFalse(g.containsNode(new Node<>(v)));
        assertEquals(0, g.vertices().size());
    }

但是 JUnit 的构建方式阻止了我完成这个方案。

所以基本上我想为我的测试提供多个参数的笛卡尔积。开箱即用的参数提供者(ValueSource, NullSource, ...)是否可以做到这一点,或者我是否需要借助 来强制设置自定义参数@MethodSource

标签: javajunit5

解决方案


通过 beatngu13 更新 2020-10-07

从 v1.0.0 开始,@CartesianProductTest作为 JUnit 5 的JUnit Pioneer扩展包的一部分提供。在https://junit-pioneer.org/docs/cartesian-product查找详细信息

JUnit 5 示例

它不支持开箱即用 - 但在https://github.com/junit-team/junit5/issues/1427已经存在一个功能请求

在此处查找示例和概念验证解决方案:https ://github.com/junit-team/junit5-samples/tree/master/junit5-jupiter-extensions

@CartesianProductTest({"0", "1"})
void threeBits(String a, String b, String c) {
    int value = Integer.parseUnsignedInt(a + b + c, 2);
    assertTrue((0b000 <= value) && (value <= 0b111));
}

@CartesianProductTest
@DisplayName("S ⨯ T ⨯ U")
void nFold(String string, Class<?> type, TimeUnit unit, TestInfo info) {
    assertTrue(string.endsWith("a"));
    assertTrue(type.isInterface());
    assertTrue(unit.name().endsWith("S"));
    assertTrue(info.getTags().isEmpty());
}

static CartesianProductTest.Sets nFold() {
    return new CartesianProductTest.Sets()
            .add("Alpha", "Omega")
            .add(Runnable.class, Comparable.class, TestInfo.class)
            .add(TimeUnit.DAYS, TimeUnit.HOURS);
}

产生一个测试计划,如:

@CartesianProductTest 示例


推荐阅读