2011-06-23 13 views
1

我正在使用「參數化」跑步者來執行一些測試。我正在從XML文件生成測試數據。這工作正常。子類是否可以修改Java中的抽象超類中靜態方法的行爲?

現在我想將此行爲應用於多個測試類,而無需複製測試數據生成代碼。所以我做了一個抽象類來完成從「一個」XML文件填充測試數據的工作。如果子類可以告訴使用哪個XML文件,我會實現我的目標。

但我一直無法找到一種方法來做到這一點。

這是我的超一流

@RunWith(Parameterized.class) 
public abstract class AbstractXMLDrivenTest{ 
    @@Parameters 
    public static Collection<Object[]> generateData() { 
     /* Reads an XML File and returns test input data */ 
    } 
} 

這裏的是一個子類

public class TestSomeThing extends AbstractXMLDrivenTest { 
    public TestSomeThing(args) { 
    /* Args are populated by generateData in superclass */ 
    } 
} 

如果我使用用於TestSomething在AbstractXMLDrivenTest XML文件也能正常工作。 我希望XML文件由子類定義,即TestSomething,以便我可以在其他測試用例中使用超類。我希望現在這是清楚的。

+0

請示例源代碼? –

+1

在這裏沒有得到重點。爲什麼在靜態方法中生成XML?爲什麼解決方案必須包含繼承(相對於組合)。 –

回答

0

靜態方法不能在Java中被重寫 - 類無論是抽象的或沒有。

2

Java中沒有靜態方法的繼承。此外,靜態方法無論其類是否抽象都沒有區別 - 類只有靜態方法的範圍函數。

爲了使用繼承,請使用非靜態方法。通過這種方式,您將能夠從子類非靜態方法或非靜態字段中提取XML文件名。

+0

參數化的測試運行器要求生成的測試數據是靜態的。它的工作方式是,它靜態地爲所有測試運行生成測試數據,然後爲每個測試數據實例創建測試用例對象並執行測試用例。 –

+0

好的 - 在這種情況下,您可以從靜態方法調用非靜態方法,例如,從'generateData'做'返回新的TestSomeThing()。nonStaticGenerateData();'或者類似的(我不知道你的確切參數是什麼) – Nick

+0

但是超級類然後會引用子類,我將無法 –

0

只有一個子類就足夠了。不要乘以測試子類,只需在不同的測試文件上調用測試方法即可。實際上,你最好不要讓你的測試類成爲一個子類,而只是一個獨立的類。

如果您要使用行業標準測試,請查看JUnit。

編輯:
您沒有仔細閱讀文檔。您根本不需要子類: 您可以按照generateData構建您的各種測試用例。 在你的情況下,你會有一對{("test1.xml", objectResult1), ("test2.xml", objectResult2),...}形式的數組。測試類的構造函數形式爲 ParametrizedTest(String fileXML, ObjectResult result)

+0

這是JUnit。 http://blogs.oracle.com/jacobc/entry/parameterized_unit_tests_with_junit –

+0

@Lalit Mishra感謝您的鏈接。看我的編輯。 – toto2

0

如果您的xml文件名存儲爲您的超類的靜態成員,請讓您的子類在調用generateTestData之前分配值。

相關問題