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 的预定功能请求。
我想为类似数据库的小型应用程序编写测试。此应用程序使用查询,查询应该 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 的预定功能请求。