使用 Junit 5 参数化对象列表

Koi*_*rab 4 java junit5

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

service.doSomething(List<Person> persons, int amount);
Run Code Online (Sandbox Code Playgroud)

假设 Person 类如下所示:

Class Person {
   PersonId id;
   String name;
}
Run Code Online (Sandbox Code Playgroud)

问题出在List <Person>. 我不确定应该如何参数化它,使用一些转换器将 Person 值转换为某种原语或使用 ArgumentsAgrragator?另外,Person 包含另一个也需要处理的对象(PersonId)。

您对我如何做到这一点有什么建议吗?

Ale*_*rov 8

如果您只需要在一个测试类中进行此参数化,则可以使用它@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),
    );
}
Run Code Online (Sandbox Code Playgroud)

如果您想为多个测试创建可重用的复杂参数源,您可以实现自己的参数源ArgumentsProvider并将其与@ArgumentsSource.