在JUnit 5中参数化beforeEach / beforeAll

问题描述 投票:1回答:1

我想为类似数据库的小应用程序编写测试。此应用程序使用查询,查询应返回正确的结果。这很容易在JUnit 5中实现,类似于

@BeforeEach
void before() {
  database = prepareDatabase();
}

@Test
void testQuery1() {
  assertThat(database.query("query1")).isEqualTo("result1");
}

@Test
void testQuery2() {
  assertThat(database.query("query2")).isEqualTo("result2");
}

....

现在我想添加优化开关(例如查询优化器或数据库索引)。无论正在运行的优化开关如何,查询都应返回相同的结果(优化只应改变效率而不是结果)。

对于测试,这意味着我想为prepareDatabase()的稍微其他实现运行相同的方法(例如,一个使用优化器,一个使用索引,一个没有任何内容。

我还没有找到适当的延伸。我想为每个优化设置复制整个类或从共享父类提供方法。然而,这并不像是JUnit 5执行此任务的方式。也许有人可以指出我可以帮助我解决这个问题的功能?

java junit5 parameterized
1个回答
0
投票

与往常一样,有多种可能的方法来实现您的目标。其中之一是使用Java继承。您甚至不需要连接任何高级JUnit 5功能,只需要旧的Java概念。

使用您的方法和abstract prepareDatabase()创建抽象类。

public abstract class QueryTest {

    Database database;

    @BeforeEach
    void before() {
        database = prepareDatabase();
    }

    @Test
    void testQuery1() {
        assertThat(database.query("query1"), is("result1"));
    }

    @Test
    void testQuery2() {
        assertThat(database.query("query2"), is("result2"));
    }

    abstract Database prepareDatabase();

}

然后 - 基于不同的变体,创建实现,仅覆盖此方法。

public class SwitchTrueQueryTest extends QueryTest {

    @Override
    Database prepareDatabase() {
        return new Database(true);
    }

}

public class SwitchFalseQueryTest extends QueryTest {

    @Override
    Database prepareDatabase() {
        return new Database(false);
    }

}

而已。没有必要,可重用的测试在父类中,不需要复制。

Report example

© www.soinside.com 2019 - 2024. All rights reserved.