使用自定义对象的参数化测试
Parameterized test using custom objects
我正在尝试为二叉搜索树的添加方法编写参数化测试
我写的测试方法:
void add() {
student5 = new Student("student5", LocalDate.of(2000,5,12), "none");
studentSet2.add(student5);
assertAll(
()->assertThat(studentSet2).contains(student5),
()->assertThat(studentSet2).hasSize(1),
()->assertThat(studentSet2.iterator().next()).isEqualTo(student5),
()->assertThat(studentSet2.toArray(new Student[1])).containsOnly(student5)
);
这是我目前的测试方法,但我想用参数化来转换它 test.But 当我开始了解它时,我发现他只能接受字符串和原始类型。
我可以为我的测试方法编写一些东西以将“学生”对象作为参数吗?
您想创建很多合成案例(或从某处读取...),例如
static Stream<Arguments> testAddToAListSource() {
final List<String> baseData = List.of("one", "two", "three");
// construct cases using a base list and adding null or a new element
return IntStream.range(0, baseData.size() + 1)
.mapToObj(n -> baseData.stream().limit(n).collect(toList()))
.flatMap(xs -> Stream.of(null, "extra", "superExtra")
.map(x -> arguments(new ArrayList<>(xs), x)));
}
此方法创建成对的字符串列表和要添加的新字符串。
假设您要验证此元素是否已正确添加到列表中并检查以下不变量
@ParameterizedTest
@MethodSource("testAddToAListSource")
void testAddToAList(List<String> caseList, String newElement) {
// count elements
final long currentSize = caseList.size();
// count how many times the element is in list
final long currentTimes = caseList.stream().filter(e -> Objects.equals(e, newElement)).count();
// add
caseList.add(newElement);
// count elements
final long newSize = caseList.size();
// count how many times the element is in list
final long newTimes = caseList.stream().filter(e -> Objects.equals(e, newElement)).count();
assertEquals(newSize, currentSize + 1);
assertEquals(newTimes, currentTimes + 1);
}
有输出
在您的具体情况下,我不知道 studentSet2
是什么类型,但您可能可以将 add
签名更改为
@ParameterizedTest
@MethodSource("testAdd")
void add(StudentSet studentSet2, Student student5) {
...
并创建像
这样的提供商
static Stream<Arguments> testAdd() {
...
我正在尝试为二叉搜索树的添加方法编写参数化测试 我写的测试方法:
void add() {
student5 = new Student("student5", LocalDate.of(2000,5,12), "none");
studentSet2.add(student5);
assertAll(
()->assertThat(studentSet2).contains(student5),
()->assertThat(studentSet2).hasSize(1),
()->assertThat(studentSet2.iterator().next()).isEqualTo(student5),
()->assertThat(studentSet2.toArray(new Student[1])).containsOnly(student5)
);
这是我目前的测试方法,但我想用参数化来转换它 test.But 当我开始了解它时,我发现他只能接受字符串和原始类型。 我可以为我的测试方法编写一些东西以将“学生”对象作为参数吗?
您想创建很多合成案例(或从某处读取...),例如
static Stream<Arguments> testAddToAListSource() {
final List<String> baseData = List.of("one", "two", "three");
// construct cases using a base list and adding null or a new element
return IntStream.range(0, baseData.size() + 1)
.mapToObj(n -> baseData.stream().limit(n).collect(toList()))
.flatMap(xs -> Stream.of(null, "extra", "superExtra")
.map(x -> arguments(new ArrayList<>(xs), x)));
}
此方法创建成对的字符串列表和要添加的新字符串。
假设您要验证此元素是否已正确添加到列表中并检查以下不变量
@ParameterizedTest
@MethodSource("testAddToAListSource")
void testAddToAList(List<String> caseList, String newElement) {
// count elements
final long currentSize = caseList.size();
// count how many times the element is in list
final long currentTimes = caseList.stream().filter(e -> Objects.equals(e, newElement)).count();
// add
caseList.add(newElement);
// count elements
final long newSize = caseList.size();
// count how many times the element is in list
final long newTimes = caseList.stream().filter(e -> Objects.equals(e, newElement)).count();
assertEquals(newSize, currentSize + 1);
assertEquals(newTimes, currentTimes + 1);
}
有输出
在您的具体情况下,我不知道 studentSet2
是什么类型,但您可能可以将 add
签名更改为
@ParameterizedTest
@MethodSource("testAdd")
void add(StudentSet studentSet2, Student student5) {
...
并创建像
这样的提供商static Stream<Arguments> testAdd() {
...