簡體   English   中英

如何模擬超級方法調用

[英]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()僅包裝切割和攔截使用常規多態性方法調用。

不要嘲笑或監視您的測試代碼

  1. UnitTest 驗證一個單元的公共可觀察行為,並且由於Child擴展了Parent我認為它們是一個“單元”。 在這種情況下, super.foo()的調用是一個實現細節,你不應該被測試。

  2. 如果您認為ChildParent是單獨的單位,您還應該考慮應用Favor Composition over Inheritance並將實例 ob Parent注入Child (最好通過構造函數參數),而不是讓Child擴展Parent 這使得用測試替身替換Parent變得更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM