使用自定义对象的参数化测试

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() {
    ...