有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JUnit 5中的java参数化beforeach/beforeAll

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

@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完成这项任务的方式。也许有人能给我指出一个能帮我解决这个问题的功能


共 (2) 个答案

  1. # 2 楼答案

    一如既往,有多种可能的方式来实现你的目标。其中之一就是使用Java继承。您甚至不需要连接任何高级JUnit5功能,只需要一个旧的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