2014-04-21 69 views
1

我正在使用Mockito進行一些單元測試。我有以下類:Mockito - 測試相同方法的派生類實現時的模擬基礎實現

public class Base { 
    public void say() { 
     System.out.println("Base"); // some work in the base class 
    } 
} 

public class Derived extends Base { 
    @Override 
    public void say() { 
     super.say(); // do the base class work 
     System.out.println("Derived"); // some additional work in the derived class 
    } 
} 

現在我要測試的派生類的say()方法,同時嘲諷基說()方法。我遵循這裏的建議:Mockito How to mock only the call of a method of the superclass和我現在有。

public class DerivedTest { 
    @Test 
    public void testSay() { 
     Derived obj = Mockito.spy(new Derived()); 
     Mockito.doNothing().when((Base)obj).say(); 
     obj.say(); 
     // assert only "Derived" was output 
    } 
} 

但是這不起作用,因爲它嘲笑基礎和派生類的實現。我想測試派生類中的額外邏輯。

我該怎麼做。

更新:我的解決方案

由於作爲建議我不能改變的基類,我修改了我的派生類中提取所有額外的邏輯在一個單獨的方法,只是測試的方法。

public class Derived extends Base { 
    @Override 
    public void say() { 
     super.say(); // do the base class work 
     doAdditionalWork(); // some additional work in the derived class 
    } 

    void doAdditionalWork() { 
     System.out.println("Derived"); 
    } 
} 

public class DerivedTest { 
    @Test 
    public void testDoAdditionalWork() { 
     Derived obj = new Derived(); 
     obj.doAdditionalWork(); 
     // assert only "Derived" was output 
    } 
} 

這意味着,我還沒有測試得出的發言權()方法,但鑑於邏輯現在有比較簡單的,我希望我可以被原諒這一點。另一個缺點是我不能比doAdditionalWork()方法的package-private更具可視性。

回答

1

當您對一個對象完全替換您爲其定義模擬行爲的方法的實現。所以,正如你在問題中提到的那樣,這是行不通的。解決此

一個竅門是提取additionalBehavior()方法,並且僅對其進行測試,而不刺探或嘲笑:

public class Base { 
    public void say() { 
     System.out.println("Base"); // some work in the base class 
     additionalBehavior(); 
    } 

    protected void additionalBehavior() { 
     // No implementation. Alternatively - make it abstract 
    } 
} 

public class Derived extends Base { 
    @Override 
    protected void additionalBehavior() { 
     System.out.println("Derived"); // some additional work in the derived class 
    } 
} 

public class DerivedTest { 
    @Test 
    public void testAdditionalBehavior() { 
     Derived obj = new Derived(); 
     obj.additioanlBehavior(); 
     // assert that "Derived" was the output 
    } 
} 
+0

感謝您的答覆。但是,我真的不能在這裏改變基類。 – Vivek

+0

這是這裏的問題。你只能模擬鬆散的聯軸器;按照定義,繼承是類型之間的緊密耦合。你絕對需要從'Base'繼承,還是有一個'Derived'可以實現的公共接口?如果有的話,您可以使用Decorator模式來實現必要的鬆散耦合。 – Lilshieste

相關問題