Mockito 说“想要但未调用”,但调试测试跳转到该方法

4 java junit unit-testing mockito

我必须处理一个没有测试的遗留应用程序。因此,在开始重构之前,我想确保一切都按原样运行。

现在想象一下以下情况:

public SomeObject doSomething(final OtherObject x, final String something) {
    if(x != null) {
        final String = someOtherMethod(x, something);
    }
}

protected String someOtherMethod(final OtherObject x, final String something) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

现在我想确保受保护的方法也被调用

所以我这样做了

@InjectMocks // Yes there is more going on here
private MyTestObject myTestObject;

private MyTestObject spy;

private static final OtherObject VALID_OTHER_OBJECT = new OtherObject();

@Before
public void setup() {
    this.spy = Mockito.spy(myTestObject);
}

@Test
public void ifOtherObjectIsNotNullExpectSubMethodToBeCalled() {
    myTestObject.doSomething(VALID_OTHER_OBJECT, null);
    verify(spy).someOtherMethod(VALID_OTHER_OBJECT, null);
}
Run Code Online (Sandbox Code Playgroud)

我得到一个失败的测试,并且“想要但没有调用......” someOtherMethod()。我直接进入调试模式并进行检查。这个方法就被调用了!

这可能是什么原因造成的?我在这里滥用间谍了吗?

编辑:我想扩展一下,我知道这不是您通常测试的内容,特别是因为someOtherMethod(...)这里有一个非空返回值。但想象一下返回值是void......

基本上我只是想了解为什么间谍在这里失败。

Dou*_*las 5

根据其 JavadocMockito.spy(object)创建传入对象的副本。然后,在原始传入对象上调用方法不会在间谍上注册,因为间谍实例不是同一对象。

更改myTestObject.doSomething(...)spy.doSomething(...),它应该可以工作。

替代方案(实现同一目标的不同方法):考虑@Spy在 myTestObject 上使用注释。请务必添加MockitoAnnotations.initMocks(this);到您的初始化方法(在您的 junit 测试中)。和注释也很有用@Before@Mock