首页  >  文章  >  Java  >  如何使用 Mockito 仅模拟超类中的特定方法调用?

如何使用 Mockito 仅模拟超类中的特定方法调用?

Patricia Arquette
Patricia Arquette原创
2024-10-31 06:17:02937浏览

How to Mock Only a Specific Method Call in a Superclass with Mockito?

使用 Mockito 仅模拟超类中的特定方法调用

使用 Mockito 进行单元测试时,可能需要仅模拟特定的方法调用调用超类中的方法,同时保持其他调用不受影响。考虑以下场景:

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

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

在此示例中,您只想模拟 ChildService 类中对 super.save() 的调用,保留其他 save() 方法调用的行为。

使用间谍和存根的解决方案

虽然重构可能是一个可行的解决方案,但它并不总是可行。在这种情况下,您可以利用间谍和存根技术来实现所需的模拟行为:

<code class="java">@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>

说明:

  1. 创建 ChildService 的实例使用Mockito的spy()方法来调用类。这将创建一个可用于选择性模拟方法的间谍对象。
  2. 在超类中存根您不想模拟的方法。这是使用 Mockito.doNothing() 完成的。在示例中,超类中的 validate() 方法被存根。
  3. 对间谍对象执行操作(在本例中,调用 save())。
  4. 验证特定方法对间谍对象进行了调用(在本例中,load() 已验证)。

通过使用间谍和存根,您可以有效地模拟所需的模拟行为,从而允许您测试特定的方法调用在超类中,同时保留原始功能。

以上是如何使用 Mockito 仅模拟超类中的特定方法调用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn