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更具可視性。
感謝您的答覆。但是,我真的不能在這裏改變基類。 – Vivek
這是這裏的問題。你只能模擬鬆散的聯軸器;按照定義,繼承是類型之間的緊密耦合。你絕對需要從'Base'繼承,還是有一個'Derived'可以實現的公共接口?如果有的話,您可以使用Decorator模式來實現必要的鬆散耦合。 – Lilshieste