`
hotdog
  • 浏览: 286243 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习Mockito - Spy对象的监视

    博客分类:
  • test
 
阅读更多
Mock对象只能调用stubbed方法,调用不了它真实的方法。但Mockito可以监视一个真实的对象,这时对它进行方法调用时它将调用真实的方法,同时也可以stubbing这个对象的方法让它返回我们的期望值。另外不论是否是真实的方法调用都可以进行verify验证。和创建mock对象一样,对于final类、匿名类和Java的基本类型是无法进行spy的。

监视对象
监视一个对象需要调用spy(T object)方法,如:List spy = spy(new LinkedList());那么spy变量就在监视LinkedList实例。

被监视对象的Stubbing
stubbing被监视对象的方法时要慎用when(Object),如:
List spy = spy(new LinkedList());
//Impossible: real method is called so spy.get(0) throws IndexOutOfBoundsException (the list is yet empty)
when(spy.get(0)).thenReturn("foo");
//You have to use doReturn() for stubbing
doReturn("foo").when(spy).get(0);

当调用when(spy.get(0)).thenReturn("foo")时,会调用真实对象的get(0),由于list是空的所以会抛出IndexOutOfBoundsException异常,用doReturn可以避免这种情况的发生,因为它不会去调用get(0)方法。

下面是官方文档给出的例子:
@Test
public void spyTest2() {
    
    List list = new LinkedList();
    List spy = spy(list);
  
    //optionally, you can stub out some methods:
    when(spy.size()).thenReturn(100);
  
    //using the spy calls real methods
    spy.add("one");
    spy.add("two");
  
    //prints "one" - the first element of a list
    System.out.println(spy.get(0));
  
    //size() method was stubbed - 100 is printed
    System.out.println(spy.size());
  
    //optionally, you can verify
    verify(spy).add("one");
    verify(spy).add("two"); 
}



分享到:
评论

相关推荐

    mockito-package-private-class:Mockito 无法在扩展包私有类的公共类上创建模拟..

    另一种可能的解决方案是使用Mockito的`@Spy`注解,它允许你模拟一个已经存在的对象。你可以先创建一个包私有类的实例,然后用`@Spy`来监视和模拟它的行为。然而,这通常只适用于你需要部分模拟的情况,而且仍然依赖...

    Mockito的重要入门资料

    #### Spy对象的监视 `spy`对象是真实对象的“间谍”,可以在测试中监视该对象的方法调用而不改变其默认行为。例如: ```java @Test public void testSpy() { List realList = new ArrayList(); List spyList = ...

    Mock初学教程

    **创建Spy对象** ```java UserRepository userRepository = spy(new UserRepository()); ``` **部分Mocking** ```java doReturn(user).when(userRepository).findById(1); ``` ##### RETURNS_SMART_NULLS和RETURNS...

    springbootTest.rar

    Mockito是常用的库,它可以创建mock对象来代替真实的依赖,或者创建spy对象来部分地使用真实对象。 5. **Test slices**:Spring Boot引入了测试切片的概念,允许仅加载测试所需的部分应用上下文。例如,`@...

    spring-demo15-测试.zip

    在测试中,我们经常需要模拟(Mock)或监视(Spy)某些对象的行为。Mockito是Spring测试常用的模拟库,可以创建完全模拟的对象,或者只对部分行为进行模拟。`@MockBean`和`@SpyBean`注解可以方便地将模拟对象注入到...

    springBootTest

    `Mockito`库则提供了更高级的mock对象验证方法。 8. **测试覆盖率**:为了确保测试的全面性,可以使用JaCoCo等工具来测量代码覆盖率,确保大部分代码都经过了测试。 9. **测试套件**:`@RunWith(SpringRunner....

Global site tag (gtag.js) - Google Analytics