首頁 >Java >java教程 >如何使用 Mockito 模擬超類別中的特定方法呼叫?

如何使用 Mockito 模擬超類別中的特定方法呼叫?

Susan Sarandon
Susan Sarandon原創
2024-10-30 18:36:30256瀏覽

How to Mock Specific Method Calls in Superclasses with Mockito?

使用Mockito 模擬超類中的特定方法呼叫

在測試場景中,可能需要僅模擬超類中的特定方法呼叫,而保留他人原有的行為。這可以使用 Mockito 靈活的模擬功能來實現。

考慮以下類別層次結構:

<code class="java">class BaseService {

    public void save() {...}
}

class ChildService extends BaseService {

    public void save() {
        // Custom logic
        super.save();
    }
}</code>

在此範例中,我們只想模擬ChildService 中對super.save() 的呼叫同時允許執行BaseService 中原始的save()實現。

為了實現這一點,我們可以使用間諜函數建立 ChildService 的代理:

<code class="java">ChildService classToTest = Mockito.spy(new ChildService());</code>

接下來,我們需要在 ChildService 的上下文中存根 super.save() 的行為。但是,由於 super 引用了 ChildService 中的 BaseService 類,因此在使用 Mockito.doNothing() 之前,我們需要將 classToTest 強制轉換為 BaseService。

<code class="java">Mockito.doNothing().when((BaseService)classToTest).validate();</code>

透過對 BaseService 的 validate() 方法進行存根,我們可以有效地防止它在測試期間被呼叫。因此,只有 ChildService 中的 super.save() 呼叫會被模擬攔截。

為了完成測試,我們現在可以在classToTest 上呼叫save() 並斷言ChildService 中的預期邏輯已執行:

<code class="java">classToTest.save();
verify(classToTest).load();</code>

這種方法允許我們選擇性地模擬超類中的特定方法調用,同時保留繼承方法的功能。在修改類別層次結構或重構程式碼不可行的情況下,它被證明是有價值的。

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

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