首頁 >Java >java教程 >如何在子類別中模擬超類別方法呼叫?

如何在子類別中模擬超類別方法呼叫?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-04 05:51:01317瀏覽

How to Mock Superclass Method Invocation in a Child Class?

在子類中模擬超類方法調用

在單元測試中,有時需要在子類中模擬方法調用,同時保留子類別中的方法呼叫超類別中的原始行為完好無損。當測試委託給父類別的方法時,可能會發生這種情況。

考慮以下範例:

<code class="java">class BaseService {
    public void save() {...}
}

public Childservice extends BaseService {
    public void save(){
        //some code
        super.save();
    }
}</code>

在這種情況下,測試只需要模擬對super.save() 的呼叫在ChildService 方法中,同時保留BaseService 類別中save()方法的原始行為。

實現此目的的一種方法是使用 Mockito 提供的間諜功能。透過監視ChildService 實例,可以存取BaseService 實例,因此可以對方法呼叫進行細粒度控制:

<code class="java">class BaseService {

    public void validate(){
        fail(" I must not be called");
    }

    public void save(){
        //Save method of super will still be called.
        validate();
    }
}

class ChildService extends BaseService{

    public void load(){}

    public void save(){
        super.save();
        load();
    }
}

@Test
public void testSave() {
    ChildService classToTest = Mockito.spy(new ChildService());

    // Prevent/stub logic in super.save()
    Mockito.doNothing().when((BaseService)classToTest).validate();

    // When
    classToTest.save();

    // Then
    verify(classToTest).load();
}</code>

透過模擬BaseService 類別中的validate() 方法,測試可確保super.save() 中的原始邏輯沒有執行。此外,存根 ChildService 類別中的 load() 方法可驗證它是否如預期般呼叫。這種方法提供了對方法呼叫的細粒度控制,並允許在測試期間隔離特定功能。

以上是如何在子類別中模擬超類別方法呼叫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn