5

介绍

我正在尝试进行测试,以验证(使用 Mockito v1.9.5's )在执行 pass-through 后调用接口中verify具有签名的方法,并且我遇到了一个我真的不明白的错误.deinit()BarFoo.deinit()

这是FooTest.java我试图运行的:

@RunWith(JukitoRunner.class)
public class FooTest {
    @Inject
    private Foo foo;
    @Inject
    private Bar bar;

    public static class TestModule extends JukitoModule {
        @Override
        protected void configureTest() {
            bind(Foo.class).to(FooImpl.class);
            bind(Bar.class).to(BarImpl.class);
            bindSpy(BarImpl.class);
        }
    }

    @Test
    public void testDeinit() {
        foo.init(mock(Baz.class));
        foo.deinit();
        verify(bar).deinit();
    }

    @After
    public void validate() {
        validateMockitoUsage(); //line YY
    }
}

运行此程序时,testDeinit()失败并出现以下错误:

org.mockito.exceptions.misusing.UnfinishedVerificationException:
Missing method call for verify(mock) here:
  -> at redacted.impl.BarImpl.deinit(BarImpl.java:XX)
  
Example of correct verification:
  verify(mock).doSomething()
  
Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods. 
Those methods *cannot* be stubbed/verified. 

at redacted.impl.FooTest.validate(FooTest.java:YY)
at org.jukito.InjectedStatement.evaluate(InjectedStatement.java:96)
at org.jukito.InjectedAfterStatements.evaluate(InjectedAfterStatements.java:58)
at org.jukito.jukitoRunner.run(JukitoRunner.java:197)

我无法从中提取很多有用的信息。似乎错误抱怨 verify(bar).deinit()可能没有.deinit()结束,我可以删除该部分并得到相同的错误。错误消息中提供的示例尤其令人沮丧,因为它看起来与我使用的verify.

细节

这是我的BarImpl.java

public class BarImpl implements Bar {
    private final Qux qux;
    private final Quux quux;

    @Inject
    public BarImpl(final Qux qux, final Quux quux) {
        this.qux = qux;
        this.quux = quux;
    }

    @Override
    private final void init(Baz baz) {
        quux.init(this);
        qux.init();
    }

    @Override
    public final void deinit() {
        qux.deinit();  //line XX
    }
}

我仍然不清楚qux.deinit()这里是如何导致失败的。这是我的FooImpl.java

class FooImpl implements Foo {
    private final Bar bar;

    @Inject
    public FooImpl(final Bar bar) {
        this.bar = bar;
    }

    @Override
    public void init(Baz baz) {
        bar.init(baz);
    }

    @Override
    public void deinit() {
        bar.deinit(); 
    }
}

问题

导致 UnfinishedVerificationException 的原因是什么,如何解决?

我是一个 Mockito 新手,所以我很可能错过了一些基本的东西。如果我可以提供更多信息,请告诉我。抱歉,如果这已经得到解答,并且我在 SO 上误解了答案。

4

2 回答 2

4

实际上您的问题出在错误消息中:

此外,由于您验证了以下任一方法,可能会出现此错误: final /private/equals()/hashCode() 方法。这些方法不能被存根/验证。

实际上,您尝试隐式验证对BarImpl#deinit哪个final方法的调用,并且Mockio不支持final方法模拟,如doc 中所述。如果要验证它,您需要final从声明中删除关键字BarImpl#deinit或使用Powermock代替。

于 2016-10-31T21:08:54.933 回答
1

就我而言,我得到这个是因为我试图对间谍(而不是模拟)进行 verify() 。我在做:

mySpy = Mockito.spy(<<constructor>>);

我不得不这样做:

mySpy = mock(MyClass.class, delegatesTo(<<constructor>>)
于 2018-04-24T04:07:33.860 回答