JUnit 5 中的参数化 beforeEach/beforeAll

Parameterized beforeEach/beforeAll in JUnit 5

我想为类似数据库的小型应用程序编写测试。此应用程序使用查询,查询应该 return 正确的结果。这在 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");
}

....

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

对于测试,这意味着我想 运行 对 prepareDatabase() 的其他一些实现使用相同的方法(例如,一个有优化器,一个有索引,一个什么都没有)。

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

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

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

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);
    }

}

就是这样。没有更多是必要的,可重复使用的测试在父 class 中,无需复制。

Report example

缺少的 JUnit5 功能称为“容器模板”,是 https://github.com/junit-team/junit5/issues/871 的预定功能请求。