以功能接口作为源值的参数化 JUnit 5 测试

Parametrized JUnit 5 test with functional interface as source value

我可以将功能接口的测试参数化为源值吗?

我正在以这种方式测试具有多个字段的记录:

@Test
void instantiateWithInvalidName() {
    thenThrowsIAE(() -> Sample.withName(""));
    thenThrowsIAE(() -> Sample.withName(BLANK_STRING));
    thenThrowsNPE(() -> Sample.withName(null));
}

@Test
void instantiateWithInvalidAddress() {
    thenThrowsIAE(() -> Sample.withAddress(""));
    thenThrowsIAE(() -> Sample.withAddress(BLANK_STRING));
    thenThrowsNPE(() -> Sample.withAddress(null));
}    
// ...
    private static NullPointerException thenThrowsNPE(Executable exec) {
    return assertThrows(NullPointerException.class, exec);
}

private static IllegalArgumentException thenThrowsIAE(Executable exec) {
    return assertThrows(IllegalArgumentException.class, exec);
}

我想做这样的事情:

@ParameterizedTest
@ValueSource(classes = { Sample::withName, Sample::withAddress }) 
void instantiateWithInvalidField() {
    thenThrowsIAE(() -> func.apply(""));
    thenThrowsIAE(() -> func.apply(BLANK_STRING));
    thenThrowsNPE(() -> func.apply(null));
}

我知道我可以通过以下参数以其他方式完成此操作:“”、BLANK_STRING 和 null。但我想逐场进行测试。我认为它更具可读性。

我想你可以这样试试:

    @ParameterizedTest
    @MethodSource("provideTestData")
    void instantiateWithInvalidField(Function<String, String> func) {
        thenThrowsIAE(() -> func.apply(""));
        thenThrowsIAE(() -> func.apply(" "));
        thenThrowsNPE(() -> func.apply(null));
    }

    private static Stream<Function<String, String>> provideTestData() {
        return Stream.of(Sample::withAddress, Sample::withName);
    }

我不知道,你的withAddresswithName方法是什么return,我假设String,所以我把String作为第二个在 Function<String, String> func.

中通用