gpt4 book ai didi

java - 嵌套类中的 junit5 MethodSource

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:04:40 25 4
gpt4 key购买 nike

我正在使用 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

关于java - 嵌套类中的 junit5 MethodSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47933755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com