簡體   English   中英

JUnit 5 中的 beforeEach/beforeAll 參數化

[英]Parameterized beforeEach/beforeAll in JUnit 5

我想為一個類似數據庫的小型應用程序編寫一個測試。 此應用程序使用查詢,查詢應返回正確的結果。 這在 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);
    }

}

就是這樣。 沒有更多的必要,可重用的測試在父類中,無需重復。

報告示例

缺少的 JUnit5 功能稱為“容器模板”,是https://github.com/junit-team/junit5/issues/871 上的預定功能請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM