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的`@Spy`注解,它允许你模拟一个已经存在的对象。你可以先创建一个包私有类的实例,然后用`@Spy`来监视和模拟它的行为。然而,这通常只适用于你需要部分模拟的情况,而且仍然依赖...
#### Spy对象的监视 `spy`对象是真实对象的“间谍”,可以在测试中监视该对象的方法调用而不改变其默认行为。例如: ```java @Test public void testSpy() { List realList = new ArrayList(); List spyList = ...
**创建Spy对象** ```java UserRepository userRepository = spy(new UserRepository()); ``` **部分Mocking** ```java doReturn(user).when(userRepository).findById(1); ``` ##### RETURNS_SMART_NULLS和RETURNS...
Mockito是常用的库,它可以创建mock对象来代替真实的依赖,或者创建spy对象来部分地使用真实对象。 5. **Test slices**:Spring Boot引入了测试切片的概念,允许仅加载测试所需的部分应用上下文。例如,`@...
在测试中,我们经常需要模拟(Mock)或监视(Spy)某些对象的行为。Mockito是Spring测试常用的模拟库,可以创建完全模拟的对象,或者只对部分行为进行模拟。`@MockBean`和`@SpyBean`注解可以方便地将模拟对象注入到...
`Mockito`库则提供了更高级的mock对象验证方法。 8. **测试覆盖率**:为了确保测试的全面性,可以使用JaCoCo等工具来测量代码覆盖率,确保大部分代码都经过了测试。 9. **测试套件**:`@RunWith(SpringRunner....