簡體   English   中英

如何在JUnit測試用例中避免繼承?

[英]How to avoid inheritance in JUnit test cases?

我在JUnit中有很多測試用例。 所有這些都需要在@BeforeClass靜態方法中執行相同的代碼。 這是一個代碼重復,我試圖擺脫它。 這樣做的一種骯臟方式是繼承。 JUnit中是否還有其他機制可能會有所幫助?

PS。 我寫了這篇關於這個主題的博客文章: http//www.yegor256.com/2015/05/25/unit-test-scaffolding.html

構建可重用代碼(而不是從中繼承)的JUnit方法是規則。

請參閱https://github.com/junit-team/junit/wiki/Rules

這是一個愚蠢的樣本,但你會明白這一點。

import org.junit.rules.TestRule;
import org.junit.runners.model.Statement;
import org.junit.runner.Description;

public class MyTestRule implements TestRule {
  @Override
  public Statement apply(final Statement statement, Description description) {
    return new Statement() {
      public void evaluate() throws Throwable {
        // Here is BEFORE_CODE
        try {
          statement.evaluate();
        } finally {
          // Here is AFTER_CODE
        }
      }
    };
  }
}

然后,您可以像這樣使用TestRule:

import org.junit.Rule;

public class MyTest {
    @Rule
    public MyTestRule myRule = new MyTestRule();
}

然后將圍繞每個測試方法執行BEFORE_CODE和AFTER_CODE。

如果您只需要為每個類運行一次代碼,請將TestRule用作@ClassRule:

import org.junit.ClassRule;

public class MyTest {
    @ClassRule
    public static MyTestRule myRule = new MyTestRule();
}

現在, BEFORE_CODEAFTER_CODE將在每個測試類周圍執行。

@Rule字段不是靜態的, @ ClassRule字段是。

@ClassRule也可以在套件中聲明。

請注意,您可以在單個測試類中聲明多個規則,這就是在測試套件,測試類和測試方法級別組成測試生命周期的方式。

規則是您在測試類中實例化的對象(靜態或非靜態)。 如果需要,您可以添加構造函數參數。

HTH

如果該方法是某種實用程序,則使用靜態方法將其分離到不同的類,並在@BeforeClass中調用該方法。

我強調的是,不要僅僅因為它解決了你的問題而使用繼承,在這樣做時使用它會在你的類層次結構中產生意義。

您可以創建測試運行器

public class MyTestRunner extends BlockJUnit4ClassRunner {
  @Override
  protected Object createTest() throws Exception {
     Object test = super.createTest();
     doStuff();
  }

  public void doStuff(){
     //common code
  }
}


@RunWith(MyTestRunner.class)
public class MyTest1{
    @Test
    public void test1(){
      //test method
    }
}

靜態方法不是繼承的,因此默認情況下繼承不是一個選項。 如果你的意思是你正在將方法移動到一個公共父類,那么這似乎是一個糟糕的選擇,因為你只能在Java中獲得一個父類。 某種測試支持類似乎更合適。 您也可能需要進行參數化測試

在這種情況下,繼承絕對沒有錯,它實際上是避免在每個子類中重復此代碼的唯一方法。 必須在JUnit中將@BeforeClass方法聲明為靜態這一事實是不幸的,但這不應該阻止你。 擴展類,您可以自動為您運行初始化代碼,而無需執行任何操作。

如果每個類都需要有一個@BeforeClass標注的方法是完全一樣的,因為每個其他,然后繼承不覺得我錯了。 如果這些初始化方法中的每一個只是共享一些代碼,那么可以使TestUtil類具有一些共享行為,並從每個@BeforeClass方法調用此共享行為。

我認為如果類具有“is-a”關系,則繼承是合理的。

如果基類是定義@BeforeClass方法的MyBeforeClass ,而MyTestClass1 “是MyBeforeClassMyBeforeClass ,則MyTestClass1 extends MyBeforeClass就可以了。

根據設置代碼的性質,您可以將所有測試放在測試套件中 ,並在那里運行設置代碼。 這樣做的缺點是您無法單獨運行測試(因為測試取決於設置代碼)。

它是測試代碼 ,並不意味着重復使用。 不要過度工程。 不要應用您知道的所有設計模式。 對於測試代碼 ,規則是不同的。

暫無
暫無

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

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