Могу ли я иметь значение переменной с аннотацией @RepeatedTest JUnit5 - PullRequest
0 голосов
/ 27 января 2020

У меня есть тестовый пример, в котором я предоставил свои тестовые данные в виде перечислений. Как

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

В моем классе Test я должен использовать его как:

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) внутри конструктора и блока stati c, а также во время объявления, как показано в этом примере.

Ответы [ 2 ]

1 голос
/ 27 января 2020

Если я правильно понимаю ваш вариант использования, вы хотите использовать @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());
    }
}

Также примечания для JUnit 5:

  • @Test методы должны быть пакетными частный (без определения видимости), не private
  • используется Assertions и не Assert
0 голосов
/ 27 января 2020

То, что вы испытываете, является ограничением компилятора Java. Если спецификация языка Java не будет изменена, вы не сможете делать то, что хотите.

Что вы можете сделать, это сделать запрос функции для Юпитера, чтобы он также принимал поставщика значений, например, типа Class<? extends Supplier<Integer>>. Или вы можете смоделировать его, используя функцию динамических тестов Jupiter c.

...