【问题标题】:Mockito says "Wanted but not invoked" but debugging test jumps into that methodMockito 说“需要但未调用”,但调试测试跳转到该方法
【发布时间】:2023-03-15 16:46:02
【问题描述】:

我必须处理没有测试的遗留应用程序。所以在我开始重构之前,我想确保一切正常。

现在想象以下情况:

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) {
    ....
}

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

所以我这样做了

@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() 的测试失败并显示“需要但未调用...”。 我直接进入调试模式并检查。调用那个方法!

这可能是什么原因?我在这里误用了间谍吗?

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

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

【问题讨论】:

    标签: java unit-testing junit mockito


    【解决方案1】:

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

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

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

    【讨论】:

    • 是深拷贝吗?
    • @Sorona 未在文档中指定,但快速检查来源说不。仅限浅拷贝。
    【解决方案2】:

    我让一个对象创建另一个对象,而另一个对象进行调用。所以我需要让那个内部对象使用间谍引用。我使用反射并使用 Whitebox 更新了参考。

    TestAddressFragment fragment = spy(new TestAddressFragment());
    AddressPresenter presenter = fragment.getPresenter();
    Whitebox.setInternalState(presenter, "view", fragment );
    

    现在我的片段可以检查它的方法是否被调用了。

    verify( fragment ).showAddress(any(), anyBoolean());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多