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)
,如本例所示
# 1 楼答案
如果我正确理解了您的用例,那么您希望将
@ParameterizedTest
与@EnumSource
一起使用,而不是@RepatedTest
-这就是JUnit5支持这种开箱即用用例的方式首先,添加对
org.junit.jupiter:junit-jupiter-params
的依赖项(它提供对@ParameterizedTest
的支持),然后:还有JUnit5的旁注:
@Test
方法应该是包私有的(没有可见性限定符),而不是private
Assertions
而不是Assert
# 2 楼答案
您遇到的是Java编译器的约束。除非更改Java语言规范,否则您不能做您想做的事情
您可以做的是向Jupiter发出功能请求,要求它也接受一个值提供程序,例如
Class<? extends Supplier<Integer>>
类型。或者你可以用Jupiter的动态测试功能来模拟它