2012-06-20 77 views
0

我想定義一個抽象方法,以便在我的抽象類中使用此方法。 然後,我想要在擴展抽象類的不同類中定義這個抽象方法。用不同的參數覆蓋抽象方法?

但我怎麼能這樣做呢? (目標是提供一些集成測試的基本方法,它們都使用相同的「結構」,但實現一些不同的邏輯)。

如何在抽象類中定義抽象方法WITH參數,在抽象類中使用此抽象方法,但是在我的測試實現中首先實現該方法?

public abstract class BaseIT { 
    protected doVerify(String params..) { 
     if (isValid()) { 
      //basic verification for all extending testcases 
     } 
    } 

    protected abstract boolean isValid(Object o); 
} 


public class TestA_IT extends BaseIT{ 
    @Test 
    public void myTest { 
     //do some specific stuff and verify with resulting params 

     doVerify(params..); 
    } 

    protected boolean isValid(Object o) { 
     return o.isValid(); 
    } 
} 

請記住,這只是我的問題(愚蠢)的例子。當然,我可以將isValid的結果傳遞給基類方法,但在我的具體情況中,這可能不是這樣。

問題是:Object o是不同的測試用例實現的對象。

我可能不會爲此使用接口。我怎樣才能使這成爲可能?

+1

我無法清楚地理解問題。爲什麼你不能重寫你的抽象方法? – Thihara

+0

就我個人而言,我認爲你已經過分複雜化了。保持測試簡單。 – duffymo

+1

而不是顯示一些不像你的真實用例,甚至沒有編譯的(愚蠢的)例子,爲什麼你不解釋你的真實用例是什麼,你想實現什麼? –

回答

0

你可以這樣做:

public class TestA_IT extends BaseIT { 
    @Test 
    public void myTest { 
     //do some specific stuff and verify with resulting params 

     doVerify(params..); 
    } 

    protected boolean isValid(Object o) { 
     return (o instanceOf YourObject) ? ((YourObject)o).isValid() : false; 
    } 
} 

冷卻器的方式做,這是實現訪問者模式,但我認爲你會沒事的這個樣子。

+0

好的,訪客模式真的很酷。很高興知道。但對於測試,我認爲模板或鑄造instanceOf似乎已經足夠。 – membersound

0

製作isValid方法會收到一個BaseIT對象並使您的TestA_IT擴展BaseIT

0

您可以定義一個Template method,然後實現子類將定義行爲。

0

您可以只投它:

((Class)o).isValid() 

但我認爲,更好的辦法是讓一個接口與方法isValid()。並使所有這些對象都實現它。

0

你的例子令人困惑,因爲你顯示的兩個類沒有繼承關係。在澄清這一點之前,您是否考慮過使您的isValid()方法具有通用性並且/或是否擁有與isValid()方法的接口類型的對象?

無論如何,請遠離涉及劇組或instanceof的解決方案。

相關問題