使用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中文網其他相關文章!