java - Mockito 说 "Wanted but not invoked"但调试测试跳转到那个方法

标签 java unit-testing junit 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) {
    ....
}

现在我想确保也调用了 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/

相关文章:

java - AEM Assets API : Create intermediate directories as required

java - 我如何从 HttpServletResponse 获取 header ?

Java.lang.reflect.InitationTargetException JApplet/HTML

unit-testing - 如何对 Angular2 中调用 window.location.href 的函数进行单元测试

java - Spring Boot 测试 - 创建名为 SpringBootRepositoryRestMvcConfiguration 的 bean 时出错

java.sql.SQLException : Field foreign_key doesn't have a default value

c# - 如何模拟(使用 Moq)由 Newtonsoft.json 序列化的接口(interface)?

javascript - 将模拟 $state 注入(inject) Angular 单元测试

junit - 如何使用 junit 5 截取测试失败的屏幕截图

java - JUnit 出现初始化错误( eclipse 氧气)