使用 Junit 5 参数化对象列表

Parametrize List of Object with Junit 5

我想用 Junit 5 参数化测试,它应该调用这样的方法:

service.doSomething(List<Person> persons, int amount);

假设人 class 看起来像这样:

Class Person {
   PersonId id;
   String name;
}

List <Person> 有问题。我不确定我应该如何参数化它,使用一些转换器将 Person 值转换为一些 primitice 或使用 ArgumentsAgrragator?另外 Person 包含另一个 Object (PersonId) 也需要处理。

你能给我一些建议吗?

如果您只需要在一个测试中进行此参数化 class,您可以使用 @MethodSource 提供任何复杂度的参数集流,例如:

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.List;
import java.util.stream.Stream;

import static org.junit.jupiter.params.provider.Arguments.arguments;

...

@ParameterizedTest
@MethodSource("doSomethingArgsProvider")
public void testServiceDoSomething(final List<Person> persons, final int amount) {
    // preparations

    service.doSomething(persons, amount);

    // assertions
}

static Stream<Arguments> doSomethingArgsProvider() {
    final var person1 = new Person(new PersonId(1), "John");
    final var person2 = new Person(new PersonId(2), "Jane");

    return Stream.of(
        arguments(List.of(person1), 1),
        arguments(List.of(person1, person2), 2),
    );
}

如果您想为多个测试创建可重复使用的复杂参数源,您可以实现自己的 ArgumentsProvider and use it with @ArgumentsSource