[英]How to mock super method call
我擴展了一個方法並試圖測試子方法,但是有一個對覆蓋方法的調用,我不知道如何模擬。
public class Parent()
{
public String foo()
{
//Various checks and validation
if(successful)
{
return null;
}
else
{
return "error";
}
}
}
public class Child()
{
boolean someVariableSetElseWhere;
@Override
public String foo()
{
String error = super.foo();
if(error == null && someVariableSetElseWhere)
{
//do some other checks
error = bar();
}
return error;
}
}
我想檢查當someVariableSetElseWhere
處於不同狀態時是否調用bar()
,但我總是從super.foo()
得到"error"
,所以 if 語句總是假的。 有沒有辦法模擬超類返回空值。
我試過
Child mock = Mockito.mock(Child.class);
Mockito.when((Parent)mock.foo()).thenReturn(null);
在我的測試中,但 Child.foo() 每次都返回 null
您不將mock()
與被測代碼一起使用,而是將spy()
與具體實例一起使用:
Child cut = Mockito.spy(new Child());
但是,這不會在覆蓋的方法工作的Child
,因為類spy()
僅包裝切割和攔截使用常規多態性方法調用。
UnitTest 驗證一個單元的公共可觀察行為,並且由於Child
擴展了Parent
我認為它們是一個“單元”。 在這種情況下, super.foo()
的調用是一個實現細節,你不應該被測試。
如果您認為Child
和Parent
是單獨的單位,您還應該考慮應用Favor Composition over Inheritance並將實例 ob Parent
注入Child
(最好通過構造函數參數),而不是讓Child
擴展Parent
。 這使得用測試替身替換Parent
變得更容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.