[英]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_CODE
和AFTER_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
“是MyBeforeClass
” MyBeforeClass
,則MyTestClass1 extends MyBeforeClass
就可以了。
根據設置代碼的性質,您可以將所有測試放在測試套件中 ,並在那里運行設置代碼。 這樣做的缺點是您無法單獨運行測試(因為測試取決於設置代碼)。
它是測試代碼 ,並不意味着重復使用。 不要過度工程。 不要應用您知道的所有設計模式。 對於測試代碼 ,規則是不同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.