junit 参数化测试中参数流的限制

blmhpbnm  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(111)

我想写一个参数化测试,它可以帮助MethodSource生成一个随机值序列。现在我想知道,是否有任何声明性的方法来限制测试运行的数量。

@ParameterizedTest
@MethodSource("create64RandomBytes")
// @SomeLimitAnnotation(100) wanted here
void testStuff(byte[] randomBytes) {
    // ...
}

static Stream<Arguments> create64RandomBytes() {
    Random rnd = new Random(42l);
    return Stream.generate(() -> {
        byte[] bytes = new byte[64];
        rnd.nextBytes(bytes);
        return Arguments.of(bytes);
    }).limit(100); // I want to avoid this "limit" call
}

当然,我可以限制流中项目的数量,但由于@MethodSource是为消费流而构建的(JUnit开发人员肯定知道无限流),我想知道是否有更好的方法来做到这一点。
TLDR:我可以在我的测试方法上用注解替换limit(100)调用吗?

np8igboo

np8igboo1#

以下内容对你有好处吗?

@RegisterExtension
static final IntegerResolver integerResolver = new IntegerResolver();

static class IntegerResolver implements ParameterResolver {
    @Override
    public boolean supportsParameter(
        ParameterContext parameterContext,
        ExtensionContext extensionContext
    ) {
        return parameterContext.getParameter().getType() == int.class;
    }

    @Override
    public Object resolveParameter(
        ParameterContext parameterContext,
        ExtensionContext extensionContext
    ) {
        return 100;
    }
}

@ParameterizedTest
@MethodSource("create64RandomBytes")
void myTest(byte[] randomBytes) {
    // ...
}

static Stream<Arguments> create64RandomBytes(int count) {
    Random rnd = new Random(42l);
    return Stream.generate(() -> {
        byte[] bytes = new byte[64];
        rnd.nextBytes(bytes);
        return Arguments.of(bytes);
    }).limit(count);
}

相关问题