JUnit5学习之六:参数化测试(Parameterized Tests)基础 (3)

在这里插入图片描述

null、空字符串数据源

在用字符串作为入参时,通常要考虑入参为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); }

执行结果如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjzjw.html