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

JUnit @参数化函数在测试套件中的@BeforeClass之前运行?

燕志学
2023-03-14

我正在使用 JUnit 测试套件来运行一些测试,其中一个测试使用@Parameterized多次运行。我发现当我运行测试时,@Parameterized函数在@BeforeClass之前运行。这是预期的行为还是发生了其他事情?我本来以为@BeforeClass会在任何测试开始之前运行。

这是我的测试套件:

@RunWith(Suite.class)
@SuiteClasses({ Test1.class, Test2.class })
public class TestSuite {

    @BeforeClass
    public static void setup() throws Exception {
        // setup, I want this to be run before anything else
    }

}

测试1使用@Parameterized:

public class Test1 {

    private String value;

    // @Parameterized function which appears to run before @BeforeClass setup()
    @Parameterized.Parameters
    public static Collection<Object[]> configurations() throws InterruptedException {

        // Code which relies on setup() to be run first

    }

    public Test1(String value) {
        this.value = value;
    }

    @Test
    public void testA() {
        // Test  
    }
}

如何解决此问题以在运行其他任何内容之前运行@BeforeClass setup() 函数?

共有3个答案

赵智
2023-03-14

最近遇到了类似的问题,并使用Function解决了问题。下面的示例。

@RunWith(Parameterized.class)
public class MyClassTest {

    @Parameterized.Parameters
    public static Iterable functions() {
        return Arrays.<Object, Object>asList(
            param -> new Object()
        );
    }

    Object param;
    Function function;

    public MyClassTest(Function f) {
        this.function = f;
    }

    @Before
    public void before() {
        // construct dependency
        param = "some value";
    }

    @Test
    public void test() {
        assertThat(myClass.doSomething(function.apply(param)), is(equalTo(expectedValue)));
    }
}

在您的场景中,在@Before或@BeforeClass中设置数据库,然后注入到函数

郑乐池
2023-03-14

虽然是一个有点不同的解决方案,但是静态块可以解决这个问题。还要注意,它必须在Test1.class中,但是除此之外,它也可以工作;-)

@RunWith(Parameterized.class)
public class Test1 {

    static{
        System.out.println("Executed before everything");
    }

    private String value;

    // @Parameterized function which appears to run before @BeforeClass setup()
    @Parameterized.Parameters
    public static Collection<Object[]> configurations() throws InterruptedException {
        // Code which relies on setup() to be run first
    }

    public Test1(String value) {
        this.value = value;
    }

    @Test
    public void testA() {
        // Test  
    }
}
莫骞仕
2023-03-14

不幸的是,这正按计划进行。JUnit需要在开始测试之前枚举所有的测试用例,对于参数化测试,该方法用< code > @ Parameterized进行注释。参数用于确定有多少测试。

 类似资料:
  • 基本的问题是,当我将JUnit测试分组为套件或套件组时,所有测试的< code>@Parameters方法在单独的套件或测试执行之前首先运行。我们的设置如下: 我们有多个测试类文件,每个文件都有包含实际测试的静态内部类。 以此类推,,等。现在,为了将所有这些测试套件收集到一个更大的集合中,我创建了一个更大型的测试套件,如下所示: 但是,无论我是运行主套件,还是,所有内部类的方法都在所有方法或实际测

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

  • 问题内容: 在JUnit 4中,使用批注很容易在多个类中测试不变式。关键是要针对单个参数列表运行一组测试。 如何在不使用JUnit-vintage的情况下在JUnit 5中复制它? 不适用于测试课程。听起来似乎很合适,但是注释的目标也是一种方法。 此类JUnit 4测试的示例是: 问题答案: JUnit 5中的参数化测试功能所提供的 功能与JUnit 4所提供的功能完全不同。引入了具有更大灵活性的

  • 参数化测试可以将不同的数据输入到测试中。不过,我创建了一个示例计算器,希望为其创建参数化测试。但是,我发现您只能为单个测试创建一组参数化数据。 我已经创建了参数化测试,用于添加两个数字,得到预期的结果。由于预期结果会有所不同,因此该数据将不适用于减法运算。 有没有可能为每个加、减、乘、除测试提供参数化数据? 非常感谢您的建议,

  • 在Eclipse中使用参数化JUnit测试时,当我想重新运行一个测试时,遇到了一个问题。测试本身运行良好,虽然我可以从上下文菜单重新运行第一个测试,但可以重新运行第二个测试: 失败,并显示以下消息: JAVAlang.Exception:未找到匹配[{ExactMatcher:fDisplayName=test[1:A2]的测试-- 我很确定这是因为JUnit不喜欢我的数组;在某些情况下:我用它来

  • 我正在尝试使用Zerocode使用Junit(4)运行负载测试。通过遵循这些教程,我能够运行现有的Junit测试类 使用零代码框架使用JUnit进行负载测试 我有一个Junit测试套件可以正常工作,我想知道如何使用zerocode来启动这个测试套件,以便它可以运行负载测试所有测试类中的所有测试。上面的例子描述了如何运行选定的测试方法,或者只运行少数测试方法。