使用 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
。
我想用 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
。