首页 > Java > java教程 > Mockito间谍:在同一类示例中嘲笑一种方法

Mockito间谍:在同一类示例中嘲笑一种方法

Robert Michael Kim
发布: 2025-03-07 18:05:45
原创
571 人浏览过

> Mockito间谍:在同一类示例中嘲笑一个方法

本示例演示了如何使用Mockito的spy>在类中模拟特定方法。 假设我们有一个称为MyClass的类:

public class MyClass {
    public int add(int a, int b) {
        return a + b + internalMethod();
    }

    private int internalMethod() {
        return 5; // This is the method we want to isolate
    }

    public int anotherMethod() {
        return 10;
    }
}
登录后复制

>我们要测试add>方法,但是我们不希望结果受internalMethod的影响。我们可以使用间谍仅模拟internalMethod

import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

public class MyClassTest {
    @Test
    void testAddMethod() {
        MyClass myClassSpy = spy(MyClass.class);
        when(myClassSpy.internalMethod()).thenReturn(10); // Mock the internal method

        int result = myClassSpy.add(2, 3);
        assertEquals(15, result); // 2 + 3 + 10 = 15
    }
}
登录后复制

MyClass在此示例中,我们创建了一个when(myClassSpy.internalMethod()).thenReturn(10);的间谍。 然后,使用internalMethod,我们将add存根返回10,将其行为从add>方法的测试中隔离。然后,主张验证了internalMethod方法的行为是否正确,给定模拟的

。 这意味着您可以在选择性模拟特定方法的同时保留大多数方法的实际实现。 要使用它,您可以使用spy创建间谍。 然后,您使用Mockito的

方法来指定要模拟的方法的行为。 例如:

spyMockito.spy(yourObject)这将创建一个间谍对象when()。打电话给

> on
MyClass myClass = new MyClass();
MyClass myClassSpy = spy(myClass);
when(myClassSpy.internalMethod()).thenReturn(10); // Mock only internalMethod
登录后复制
>将返回10。所有其他方法都将使用其实际实现。这使得对特定方法的行为有针对性的测试与其他班级的其余部分隔离。请记住,您必须使用

来定义要模拟的方法的行为;否则,它将称为实际实施。myClassSpy>internalMethod在同一类中测试方法时,使用Mockito Spies的潜在陷阱是什么?

  • >意外副作用:由于间谍保留了原始实现,因此仍将发生未锁定方法的任何副作用。这可能会导致测试过程中出乎意料的行为,并使其难以隔离正在测试的单元。 如果internalMethod修改对象的状态,即使您嘲笑了其返回值。
  • >困难调试:当出乎意料的行为发生时,确定错误的源头可能会很具有挑战性。这是测试方法的问题,还是未锁定方法的副作用?
  • 紧密耦合:
  • 不必要的复杂性:如果您可以使用简单的模拟有效地测试方法,则不需要添加间谍的复杂性。 模拟通常更简单,不容易出乎意料的副作用。

>在单位测试期间处理内部方法调用时,我什么时候应该选择一个模拟性间谍?

>

>您通常应该偏爱模拟嘲笑而不是间谍,除非您有一个有力的理由使用Spy。 选择一个间谍时:

  • >测试相互作用:您需要测试您的测试方法及其内部方法之间的相互作用,并且内部方法具有重大的副作用或依赖性,这些副作用或依赖性易于模拟。>>
  • formacy代码:

有限的控制:

>您对班级的内部方法的控制有限,例如处理具有复杂依赖关系的最终方法或方法时。>>但是,即使在这些情况下,也要仔细考虑上面提到的潜在陷阱。 如果可能的话,与依靠间谍一起解决复杂的依赖性或副作用的工作通常是更好的长期解决方案。 通常,结构良好的设计具有明确的关注点,可以使用模拟进行更简单,更可靠的测试。

以上是Mockito间谍:在同一类示例中嘲笑一种方法的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板