5.1 @ParameterizedTest注解

有时您只想使用不同的参数多次调用测试:不同的值、不同的输入参数、不同的用户名。JUnit 旨在让您的生活更轻松,因此对于这种情况,它具有参数化测试这样的东西。

要使用参数化测试,您需要再添加一个依赖项到您的pom.xml

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

那么我们可以考虑一个例子:

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethod(int argument) {
    //test code
}

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
    //test code
}

每个测试方法都会被调用3次,每次调用都会传递另一个参数给它。值是使用另一个注解 - @ValueSource设置的。但关于它还需要多说几句。

5.2 @ValueSource注解

@ValueSource注释非常适合处理基元和文字。只需列出以逗号分隔的参数值,测试将为每个值调用一次。

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
    //test code
}

但也有一个缺点——这个注解不支持 null,所以你需要为它使用一个特殊的拐杖—— @NullSource。它看起来像这样:

@ParameterizedTest
@NullSource
void testMethodNullSource(Integer argument) {
    assertTrue(argument == null);
}

5.3 @EnumSource注解

还有一个特殊的注解@EnumSource,它将特定 Enum 的所有值传递给方法。它的应用程序看起来像这样:

enum Direction {
    EAST, WEST, NORTH, SOUTH
}

@ParameterizedTest
@EnumSource(Direction.class)
void testWithEnumSource(Direction d) {
    assertNotNull(d);
}

5.4 @MethodSource注解

但是如何将对象作为参数传递呢?特别是如果他们有复杂的构造算法。为此,您可以简单地指定一个特殊的辅助方法,该方法将返回此类值的列表 (Stream)。

例子:

@ParameterizedTest
@MethodSource("argsProviderFactory")
void testWithMethodSource(String argument) {
    assertNotNull(argument);
}

static Stream<String> argsProviderFactory() {
    return Stream.of("one", "two",  "three");
}

具有多个参数的参数化测试

当然,您已经想知道如果要将多个参数传递给该方法该怎么办。对此有一个非常酷的@CSVSource注释。它允许您列出方法参数的值,简单地用逗号分隔。

例子:

@ParameterizedTest
@CsvSource({
    "alex, 30, Programmer, Working",
    "brian, 35, Tester, Working",
	"charles, 40, manager, kicks"
})
void testWithCsvSource(String name, int age, String occupation, String status) {
	//method code
}