我正在使用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。
我应该怎么做才能解决这个问题?
Moh*_*nan 12
另一个基于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);
    }
}
}
Sor*_*ras 10
@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
这场比赛有点晚了,但是......
您可以在外部类中将提供者实现为静态的。然后,在@MethodSource 中,您只需提供参数的完全限定名称(即 com.biz.pckg.colors)。
这记录在 JUnit 用户指南中。
| 归档时间: | 
 | 
| 查看次数: | 1016 次 | 
| 最近记录: |