我想为类似数据库的小应用程序编写测试。此应用程序使用查询,查询应返回正确的结果。这很容易在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继承。您甚至不需要连接任何高级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);
}
}
而已。没有必要,可重用的测试在父类中,不需要复制。