Mockito Spy–部分模拟
时间:2020-02-23 14:40:45 来源:igfitidea点击:
我们可以使用Mockito Spy来部分模拟对象。
当我们监视对象时,除非将其存根,否则将调用真正的方法。
Mockito Spy
我们可以使用两种方法创建模仿 Spy对象。
- Mockito.spy()方法
- Mockito @ Spy注释
Mockito spy()方法示例
以下是使用Mockitospy()方法的简单示例。
package com.theitroad.mockito.spy;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class MockitoSpyExample {
@Test
void test() {
List<String> list = new ArrayList<>();
List<String> spyOnList = spy(list);
spyOnList.add("A");
assertEquals(1, spyOnList.size());
assertEquals("A", spyOnList.get(0));
spyOnList.add("E");
assertEquals(2, spyOnList.size());
assertEquals("E", spyOnList.get(1));
when(spyOnList.size()).thenReturn(10);
assertEquals(10, spyOnList.size());
}
}
注意,真正的实现会调用add(),get()和size()方法,直到它们没有被存根。
在稍后的时间,我们对size()方法进行了存根处理。
从那时起,将调用存根方法。
Mockito @Spy注释示例
这是@Spy注释的示例,我们已经将上面的测试程序转换为使用@Spy注释。
package com.theitroad.mockito.spy;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import static org.junit.jupiter.api.Assertions.*;
public class MockitoSpyAnnotationExample2 {
@Spy
List<String> spyOnList = new ArrayList<>();
@BeforeEach
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
void test() {
spyOnList.add("A");
assertEquals(1, spyOnList.size());
assertEquals("A", spyOnList.get(0));
spyOnList.add("E");
assertEquals(2, spyOnList.size());
assertEquals("E", spyOnList.get(1));
when(spyOnList.size()).thenReturn(10);
assertEquals(10, spyOnList.size());
}
}
当我们不得不在多个地方重用 Spy对象时,最好使用@Spy批注。
请注意,使用其他实例创建 Spy对象不是强制性的,以下也是可接受的用法。
List<String> spyOnList = spy(List.class); @Spy List<String> spyOnList1;
但是,建议提供实施。
因为在这种情况下,Mockito将尝试使用no-args构造函数实例化模拟对象。
另外,它不会实例化内部类,本地类等。
我们知道List实现类使用内部类。
因此,您将无法从测试中获得预期的结果。
Mockito Spyvs doCallRealMethod()
我们也可以在模拟对象上使用doCallRealMethod()来调用真实方法,但是,建议使用Spy创建部分模拟。
因为在Spy中,我们正在实例化一个对象,而在创建模拟对象时,Mockito会创建该对象的最小实例。
可能是在创建模拟时未初始化所需的依赖关系,从而导致错误的结果。

