有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我可以用@RepeatedTest注释JUnit5获得变量值吗

我有一个测试用例,其中我以枚举的形式提供了我的测试数据。像

enum TestTransactions {
    TestTransactions(Transaction T1, Transaction T2, String expectedOutput){}
}

在我的测试课程中,我必须将其用作:

class Test {
    private final static int REPETITION_COUNT = TestTransactions.values().length;

    @RepeatedTest(value=REPETITION_COUNT)
    private void testAllTransactions(RepetitionInfo info) {
        TestTransactions currentTest = TestTransactions.values()[info.getCurrentRepetition()];
        logger.info("Executing test for " + currentTest.name());

        setExpectationsFor(currentTest);
        whenControllerIsCalled();
        Assert.assertEquals(currentTest.getExpectedOutput(), result.getBody());
    }
}

这一行@RepeatedTest(value=REPETITION_COUNT)给出了编译错误,表示“属性值必须是常量”

有没有办法做到这一点?尽管我已经尝试在构造函数和静态块内部以及在声明期间分配REPETITION_COUNT (declared as final),如本例所示


共 (2) 个答案

  1. # 1 楼答案

    如果我正确理解了您的用例,那么您希望将@ParameterizedTest@EnumSource一起使用,而不是@RepatedTest-这就是JUnit5支持这种开箱即用用例的方式

    首先,添加对org.junit.jupiter:junit-jupiter-params的依赖项(它提供对@ParameterizedTest的支持),然后:

    class Test {
        @ParameterizedTest
        @EnumSource
        void testAllTransactions(TestTransactions currentTest) {
            logger.info("Executing test for " + currentTest.name());
    
            setExpectationsFor(currentTest);
            whenControllerIsCalled();
            Assertions.assertEquals(currentTest.getExpectedOutput(), result.getBody());
        }
    }
    

    还有JUnit5的旁注:

    • @Test方法应该是包私有的(没有可见性限定符),而不是private
    • 使用Assertions而不是Assert
  2. # 2 楼答案

    您遇到的是Java编译器的约束。除非更改Java语言规范,否则您不能做您想做的事情

    您可以做的是向Jupiter发出功能请求,要求它也接受一个值提供程序,例如Class<? extends Supplier<Integer>>类型。或者你可以用Jupiter的动态测试功能来模拟它