在用字符串作为入参时,通常要考虑入参为null的情况,此时ValueSource一般会这样写:
@ValueSource(strings = { null, "a", "b", "c" })此时可以使用@NullSource注解来取代上面的null元素,下面这种写法和上面的效果一模一样:
@NullSource @ValueSource(strings = { "a", "b", "c" })执行结果如下图红框,可见null作为入参被执行了一次:
4. 与@NullSource代表null入参类似,@EmptySource代表空字符串入参,用法和执行结果如下图所示:
5. 如果想同时用null和空字符串做测试方法的入参,可以使用@NullAndEmptySource,用法和执行结果如下图所示: 枚举数据源(EnumSource)
EnumSource可以让一个枚举类中的全部或者部分值作为测试方法的入参;
创建枚举类Types.java,用于接下来的实战,如下,很简单只有三个值:
public enum Types { SMALL, BIG, UNKNOWN }先尝试用Types的每个值作为入参执行测试,可见只要添加@EnumSource即可,JUnit根据测试方法的入参类型知道要使用哪个枚举:
@Order(6) @DisplayName("多个枚举型入参") @ParameterizedTest @EnumSource void enumSourceTest(Types type) { log.info("enumSourceTest [{}]", type); }执行结果如下图所示:
5. 如果不想执行枚举的所有值,而只要其中一部分,可以在name属性中指定: @EnumSource(names={"SMALL", "UNKNOWN"})
执行结果如下图所示:
7. 也可以指定哪些值不被执行,此时要添加mode属性并设置为EXCLUDE(mode属性如果不写,默认值是INCLUDE,前面的例子中就是默认值): @EnumSource(mode= EnumSource.Mode.EXCLUDE, names={"SMALL", "UNKNOWN"})
执行结果如下,可见SMALL和UNKNOWN都没有执行:
方法数据源(MethodSource)@MethodSource可以指定一个方法名称,该方法返回的元素集合作为测试方法的入参;
先来定义一个方法,该方法一般是static类型(否则要用@TestInstance修饰),并且返回值是Stream类型:
static Stream<String> stringProvider() { return Stream.of("apple1", "banana1"); }然后,测试方法用@MethodSource,并指定方法名stringProvider:
@Order(9) @DisplayName("静态方法返回集合,用此集合中每个元素作为入参") @ParameterizedTest @MethodSource("stringProvider") void methodSourceTest(String candidate) { log.info("methodSourceTest [{}]", candidate); }上面的stringProvider方法和测试方法methodSourceTest在同一个类中,如果它们不在同一个类中,就要指定静态方法的整个package路径、类名、方法名,如下所示,类名和方法名之间用#连接:
@Order(10) @DisplayName("静态方法返回集合,该静态方法在另一个类中") @ParameterizedTest @MethodSource("com.bolingcavalry.parameterized.service.impl.Utils#getStringStream") void methodSourceFromOtherClassTest(String candidate) { log.info("methodSourceFromOtherClassTest [{}]", candidate); }如果不在@MethodSource中指定方法名,JUnit会寻找和测试方法同名的静态方法,举例如下,静态方法methodSourceWithoutMethodNameTest会被作为测试方法的数据来源:
static Stream<String> methodSourceWithoutMethodNameTest() { return Stream.of("apple3", "banana3"); } @Order(11) @DisplayName("静态方法返回集合,不指定静态方法名,自动匹配") @ParameterizedTest @MethodSource void methodSourceWithoutMethodNameTest(String candidate) { log.info("methodSourceWithoutMethodNameTest [{}]", candidate); }执行结果如下: