我想为一个小型的类似数据库的应用程序编写一个测试。此应用程序使用查询,查询应返回正确的结果。这在 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 概念即可。
使用您的方法和抽象的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);
}
}
就是这样。没有什么是必要的,可重用的测试在父类中,不需要重复。
报告示例 https://i.stack.imgur.com/ATGZl.png
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)