2015-04-02 184 views
1

如何測試抽象類?我研究了它,發現我需要創建一個模擬對象,但是如何創建一個模擬對象?我不知道,有人可以幫忙嗎?例如,這是我的抽象類:如何測試抽象類的方法?

public abstract class Aging { 
    private int age; 

    public Aging(int age) { 
     setAge(age); 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 
} 

我試圖用這個代碼來測試構造:

@Test 
public void testAgingConstructor() { 
    Aging a = new Aging(18); 
    a.setAge(19); 
    Aging b = new Aging(19); 
    assertEquals(b, a); 
} 

,我得到一個錯誤消息「老齡化是抽象的,不能被實例化」 。我該怎麼辦?

回答

2

爲了實例化你的抽象類,你需要創建一個具體的子類。

@Test 
public void testAgingConstructor() { 
    class AgingSubclass extends Aging { 
     public AgingSubclass(int age) { super(age); } 
    } 
    Aging a = new AgingSubclass(18); 
    a.setAge(19); 
    Aging b = new AgingSubclass(19); 
    assertEquals(b, a); 
} 
+0

像其他人一樣說,不需要測試抽象類。我需要的只是測試子類,並確保他們使用超類的正確方法。謝謝 – Lenic 2015-04-02 21:23:17

1

我會創建一個擴展您的抽象class.it將是一個新的非抽象類是空類除與擴展條款的標題。 然後你將能夠測試你在抽象類中實現的方法。

1

的問題要問自己的是:

爲什麼我需要測試這個類?

它是一個致力於被其他模塊擴展的類嗎?那麼是的,你應該通過實際測試這個用例來測試它:擴展你的抽象類並驗證你得到的行爲是否是預期的。

它是一個類,將用於你的模塊,你有一些實現?那麼你應該很可能測試這些實現的行爲,從而測試具體的類。總而言之,你最終要測試的是一些擴展抽象類的具體類。

Mocking允許您在測試時不關心類的依賴關係,而與您的問題無關。

和一個不錯的技巧,如果你不想打擾寫一個具體的類,你可以使用是利用使用匿名類:

@Test 
public void testAgingConstructor() { 
    Aging a = new Aging(18){}; //Create anonymous subclass and instantiate it. 
    a.setAge(19); 
    Aging b = new Aging(19){}; 
    assertEquals(b, a); 
} 
0

爲你的類應該是如下。它演示瞭如何實現內聯抽象類(花括號)。如果在抽象類中有抽象方法,則必須在大括號內覆蓋和實現它們。

@Test 
public void testAgingConstructor(){ 
    Aging a =new Aging(18) {}; 
    a.setAge(19); 
    Aging b =new Aging(19) {}; 
    assertEquals(b,a); 
}