如何在 JUnit 5 中使用少量枚举创建参数化测试?

Vic*_*vin 12 java junit unit-testing parameterized-tests junit5

例如,我的项目中有几个枚举:

  • 图,值为 TRIANGLE 和 SQUARE
  • 颜色,值为红色和黄色

如何使用所有组合的笛卡尔积创建测试?以下代码不起作用:

// this doesn't work
@ParameterizedTest
@EnumSource(value = Figure.class)
@EnumSource(value = Color.class)
void test(Figure figure, Color color) {
    System.out.println(String.format("%s_%s",figure,color));
}
Run Code Online (Sandbox Code Playgroud)

我想获得所有组合:

TRIANGLE RED
TRIANGLE YELLOW
SQUARE RED
SQUARE YELLOW
Run Code Online (Sandbox Code Playgroud)

我的临时解决方案是使用注释@MethodSource

// this works
@ParameterizedTest
@MethodSource("generateCartesianProduct")
void test(Figure figure, Color color) {
    System.out.println(String.format("%s_%s",figure,color));
}


private static Stream<Arguments> generateCartesianProduct() {
    List<Arguments> argumentsList = new ArrayList<>();

    for(Figure figure : Figure.values()) {
        for(Color color : Color.values()) {
            argumentsList.add(Arguments.of(figure,color));
        }
    }

    return argumentsList.stream();
}
Run Code Online (Sandbox Code Playgroud)

但我不想在测试中添加额外的代码。JUnit 5 有解决我的问题的方法吗?

bea*_*u13 3

JUnit Pioneer附带@CartesianTest

import org.junitpioneer.jupiter.cartesian.CartesianTest;
import org.junitpioneer.jupiter.cartesian.CartesianTest.Enum;

class FigureAndColorTest {

    enum Figure {
        TRIANGE, SQUARE
    }

    enum Color {
        RED, YELLOW
    }

    @CartesianTest
    void test(@Enum Figure figure, @Enum Color color) {
        System.out.printf("%s %s%n", figure, color);
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

TRIANGE RED
TRIANGE YELLOW
SQUARE RED
SQUARE YELLOW
Run Code Online (Sandbox Code Playgroud)

免责声明:我是 JUnit Pionner 的维护者之一。