当前位置: 首页 > 知识库问答 >
问题:

如何在JUnit 5参数化测试中保持状态?

南门宇
2023-03-14

是否可以在参数化测试的执行过程中保留对变量所做的更改?

我有一个简单的日历,存储添加到它的事件:

class MyCalendar {

    private final List<int[]> events;

    public MyCalendar() {
        events = new ArrayList<>();
    }

    public boolean book(int start, int end) {
        // some validation logic here
        events.add(new int[]{start, end});
        return true;
    }
}

为了测试它在后续调用中是否有效,我需要在测试中多次调用它:

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

class MyCalendarTest {

    private MyCalendar myCalendar = new MyCalendar();

    @Test
    void givenExample1() {
        myCalendar = new MyCalendar();
        assertTrue(myCalendar.book(10, 20));
        assertFalse(myCalendar.book(15, 25));
        assertTrue(myCalendar.book(20, 30));
    }

}

这很好。但是,我不能用参数化测试来代替它:

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

class MyCalendarTest {

    private MyCalendar myCalendar = new MyCalendar();

    @ParameterizedTest
    @CsvSource(value = {"10,20,true", "15,25,false", "20,30,true"})
    void givenExample2(int start, int end, boolean expected) {
        assertEquals(expected, myCalendar.book(start, end));
    }

}

问题是,myCalendar在每次测试执行后都会重新初始化,因此之前添加的事件会丢失。当然,在测试方法中移动初始化也没有帮助。

这有可能吗?

共有1个答案

陶英纵
2023-03-14

通常,所有参数化测试都是独立运行的。因此,您无法在参数化测试中访问以前的值。此外,参数化测试的执行顺序可以是随机的,具体取决于空闲线程的数量和并行处理。

用例的解决方案之一是将数据存储在一个数组中。然后循环遍历该数组并调用所需的函数。通过这种方式,您可以在后续的方式中测试您的函数,并且您可以控制值的顺序。

 类似资料:
  • 在JUnit 4中,通过使用注释很容易跨一堆类测试不变量。关键是一组测试正在针对单个参数列表运行。 如何在JUnit 5中复制这一点,而不使用JUnit-vintage? 不适用于测试类。听起来可能是合适的,但该注释的目标也是一个方法。 此类 JUnit 4 测试的一个示例是:

  • 我正在尝试从CSV文件运行参数化测试。 如果我只使用这样的CSVSource,它就会起作用: 但如果我从一个文件中尝试同样的方法,它将不起作用: 我也尝试过使用硬路径访问我的文件,但对于Eclipse中的文件测试,我总是能得到消息 找不到使用测试runnter“JUnit 5”的测试。 JUnit期望文件在哪里? 以下是我的依赖关系: 有人知道我可能遗漏了什么或者错误在哪里吗? 提前谢谢你 保罗

  • 我试图定义一个,如示例MockitoExtension所提供的,但无法成功地使用参数化的类实例。 期待着关于如何用在中实现接口的类的参数化实例测试接口的建议。

  • 问题内容: 在JUnit4中,您可以通过在一种方法中提供参数集合来编写参数化的单元测试,这些参数将被传递给测试的构造函数,并通过另一种方法进行测试。如果我有一个预期引发异常的参数,该如何指定? 问题答案:

  • 注意:我已经做了一个搜索和阅读了各种博客,但找不到一个例子,与我正在尝试做什么。 它似乎不喜欢我的某个测试成员字段是私有的,但没有告诉我它对哪个字段有问题。我见过的单元测试的所有例子,唯一公开的一定是ExpectedException规则。

  • 我有一个类,它是有向无环图上拓扑排序的实现。此类中有两种方法: > 公共静态int[]排序(int[][]dag)-将表示DAG的二维数组作为参数,并返回有序节点的数组 私有静态无效访问-该访问执行深度优先搜索,并用于排序方法 我必须编写一个JUnit测试来测试具有不同输入的代码。我对JUnit测试比较陌生,不知道如何解决这个问题。我想我需要编写一个参数化测试,但是如何测试静态方法sort(int