我必须处理一个没有测试的遗留应用程序。因此,在我开始重构之前,我想确保一切正常。
现在想象以下情况:
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) {
....
}
现在我想确保也调用了 protected 方法
所以我这样做了
@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);
}
对于 someOtherMethod()
,我得到一个失败的测试和“需要但未调用...”。
我直接进入 Debug模式并进行了检查。调用该方法!
这可能是什么原因造成的?我在这里滥用 spy 吗?
编辑: 我想强调一下,我知道这不是您通常要测试的内容,尤其是因为 someOtherMethod(...)
有一个非空返回-这里的值(value)。但是想象一下返回值是 void
...
基本上我只是想了解为什么 spy 在这里失败了。
最佳答案
根据 its Javadoc , Mockito.spy(object)
创建传入对象的副本。调用原始传入对象的方法不会在 spy 上注册,因为 spy 实例不是同一个对象。
将 myTestObject.doSomething(...)
更改为 spy.doSomething(...)
它应该可以工作。
备选方案(实现同一件事的不同方式):
考虑在您的 myTestObject 上使用 @Spy
注释。
请务必将 MockitoAnnotations.initMocks(this);
添加到您的初始化方法(在您的 junit 测试中)。
@Before
和 @Mock
注释也很有用。
关于java - Mockito 说 "Wanted but not invoked"但调试测试跳转到那个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39418975/