簡體   English   中英

強制JUnit子類測試覆蓋@BeforeClass方法

[英]Enforcing that a JUnit subclass test overrides a @BeforeClass method

我擁有一個相當於JUnit抽象測試的輕量級測試框架。 我想做的是讓實現子類每個都定義其自定義測試類設置。 我的計划是讓抽象超類定義一個@BeforeClass方法,該方法調用將強制每個子類定義的抽象設置方法,但這失敗了,因為@BeforeClass方法必須是靜態的,並且不能將靜態方法抽象化,也不能將它們抽象化。調用實例方法。

我只是假設子類將通過包含文檔中所需的內容或引發IllegalStateException ,但出於多種原因,我真的很希望能夠在接口級別上強制執行此設置。 有人可以考慮為此解決嗎?

順便說一下,在將這些測試參數化時,我遇到了同樣的問題(子類定義了參數,但是@Parameters注釋的方法必須是靜態的)。 我通過使用允許方法級參數的第三方JUnitParams運行程序來解決此問題。 在這里查看: https : //github.com/Pragmatists/JUnitParams

對於您的主要問題,為什么不將您的父類抽象化並使用@Before注釋而不是@BeforeClass呢? 例如:

public abstract class TestParent {
   @Before
   public void setup() {
     doSetup();
   }

   protected abstract void doSetup();

   // other stuff...
}

public class RealTest extends TestParent {
    protected void doSetup() {
      // custom setup
    }

    // custom tests...
}

這將強制子類重新定義doSetup()方法,而無需使用靜態方法。

一種選擇是讓子類實現一個靜態的doSetupOnce()方法,然后從基類@BeforeClass方法中反射地查找和調用該方法。 由於此方法必須是靜態方法,因此只能在運行時強制其存在。

另一種方法是在基類中有一個抽象的doSetupOnce實例方法,該方法在第一次調用父級的@Before方法時被調用。 這在編譯時就產生了問題,但是實現者將必須小心不要從該方法訪問實例字段(因為這可能不是他們想要的)。

總的來說(不知道您所處情況的詳細信息),我不太喜歡這兩種方法,寧願讓實現者在需要時聲明@BeforeClass方法。 將它們鎖定在嚴格的基類方案中會導致超出解決方案的更多問題。 還應考慮使用JUnit規則,它通常是比基類更好的選擇(例如,因為它們是可組合的)。 當然,您也可以將這兩種方法結合起來,主要依靠JUnit規則,另外還提供一些帶有預定義規則的基類以方便使用。

這可能超出范圍或過於矯kill過正,但我​​認為值得一提,因為它們並沒有太大的不同。 因此,我邁出了堅實的一步 ,建議您可以嘗試使用TestNG,因為用@BeforeClass注釋的方法不必是靜態的,用@Parameters注釋的方法也不必是靜態的。

您可以在此處了解這兩個框架之間的差異,並且看起來它們也支持將JUnit測試遷移到TestNG。

我認為不可能以一種干凈的OO方式做到這一點。 @BeforeClass不僅是靜態方法,而且JUnit將在子級@BeforeClass之前調用父級的@BeforeClass

無論如何,您嘗試執行此操作都必須暴露父類的內部靜態狀態,以便子類可以設置父類的字段,從而破壞封裝。

我認為最好的方法是使用@Before,而且還有一個靜態標志來設置該方法是否在之前被調用過,這樣至少您可以短路並且僅對第一個調用進行初始化。

暫無
暫無

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

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