在子類中模擬超類方法調用
在單元測試中,有時需要在子類中模擬方法調用,同時保留子類別中的方法呼叫超類別中的原始行為完好無損。當測試委託給父類別的方法時,可能會發生這種情況。
考慮以下範例:
<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中文網其他相關文章!