为什么间谍方法不能被打断?

时间:2018-11-15 15:39:25

标签: mockito stub spy

我想知道由Mockito注入的间谍是否可以被篡改以重新获得价值。但是下面的代码抛出IndexOutOfBoundsException。因此,我认为是调用了get()的真实版本,而不是存根版本。间谍可以被打bed吗?

@Test
public void doReturnUsage() throws Exception {
    List<String> list = new ArrayList<String>();
    List<String> spy = spy(list);
    when(spy.get(0)).thenReturn("not reachable");
    assertEquals("now reachable", spy.get(0));
}

2 个答案:

答案 0 :(得分:0)

使用@Spy时,语法与使用普通Injected实例时略有不同。

Mockito.doReturn("not reachable").when(spy).get(0);

当您要“模拟”正在测试的类下的公共方法时,可以用作间谍。 例如

Class A {
  public void methodA() {
    // do something
  }
  public void methodB() {
    // do something 
    call methodA();
   // do something else 
  }
}

在这里,从公共方法“ methodB”调用类A的公共方法“ methodA”。因此,当为“ methodB”编写测试用例时,我们使用间谍对“ methodA”的调用进行了模拟。并且我们独立测试“ methodA”

答案 1 :(得分:0)

考虑另一个示例:

List<String> list = new LinkedList<String>();
List<String> spy = spy(list);
when(spy.size()).thenReturn(100);
when(spy.get(0)).thenReturn("good");
System.out.println(spy.get(0));
System.out.println(spy.size());

为什么可以将spy.size()存根,而不能将spy.get(0)存根?