我想使用 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)。
您对我如何做到这一点有什么建议吗?
如果您只需要在一个测试类中进行此参数化,则可以使用它@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.
| 归档时间: |
|
| 查看次数: |
2851 次 |
| 最近记录: |