簡體   English   中英

嵌套類中的 junit5 MethodSource

[英]junit5 MethodSource in nested class

我正在使用 junit5,我想在嵌套類中創建參數化測試。 例如:

class CardTest {

    @Nested
    class Cost {
        Stream<Arguments> cards() {
            return Stream.of(
                    Arguments.of(Card.common(0, Color.RED), 0),
                    /** Other Data **/
                    Arguments.of(Card.choseColor(), 50)
            );
        }

        @MethodSource("cards")
        @ParameterizedTest
        void cardCost(Card card, int cost) {
            assertThat(card.cost())
                    .isEqualTo(cost);
        }
    }
    /** Some other nested classes or simple methods **/
}

問題是@MethodSource要求指定的方法必須是static 但是Java不允許在非靜態內部類中使用靜態方法。 如果我創建類Cost static那么它不會被junit收集。

我應該怎么做才能解決這個問題?

@TestInstance(PER_CLASS)

您可以選擇“每個類單個測試實例”模式,使用@TestInstance(TestInstance.Lifecycle.PER_CLASS)注釋嵌套類:

class ColorTest {

    @Nested
    @TestInstance(TestInstance.Lifecycle.PER_CLASS)
    class Inner {

        @ParameterizedTest
        @MethodSource("colors")
        void blue(Color color, int blue) {
            Assertions.assertEquals(color.getBlue(), blue);
        }

        Stream<Arguments> colors() {
            return Stream.of(
                    Arguments.of(Color.BLACK, 0),
                    Arguments.of(Color.GRAY, 128),
                    Arguments.of(Color.BLUE, 255)
            );
        }
    }

}

使用這種模式時,每個測試類都會創建一個新的測試實例。

參數提供者

或者您可以從MethodSource切換到ArgumentsProvider

我修改了您的示例以查看它是否在本地編譯和運行:

class ColorTest {

    static class Blues implements ArgumentsProvider {

        @Override
        public Stream<Arguments> provideArguments(ExtensionContext context) {
            return Stream.of(
                    Arguments.of(Color.BLACK, 0),
                    Arguments.of(Color.GRAY, 128),
                    Arguments.of(Color.BLUE, 255)
            );
        }
    }

    @Nested
    class Inner {

        @ParameterizedTest
        @ArgumentsSource(Blues.class)
        void blue(Color color, int blue) {
            Assertions.assertEquals(color.getBlue(), blue);
        }
    }

}

更多詳細信息,請訪問http://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests

另一個基於JUnit 5.2.0 的變體是這個。

class ColorTest {

public static Stream<Arguments> provideColors() {
    return Stream.of(
            Arguments.of(Color.BLACK, 0),
            Arguments.of(Color.GRAY, 128),
            Arguments.of(Color.BLUE, 255)
    );
}

@Nested
class Inner {

    @ParameterizedTest
    @MethodSource("com.domain.ColorTest#provideColors")
    void blue(Color color, int blue) {
        Assertions.assertEquals(color.getBlue(), blue);
    }
}

}

這場比賽有點晚了,但是......

您可以在外部類中將提供者實現為靜態的。 然后,在@MethodSource 中,您只需提供參數的完全限定名稱(即 com.biz.pckg.colors)。

這記錄在 JUnit 用戶指南中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM