Java 缺少对verify(mock)的方法调用,但有一个吗? 介绍

Java 缺少对verify(mock)的方法调用,但有一个吗? 介绍,java,mockito,jukito,Java,Mockito,Jukito,我正在尝试做一个测试,验证(使用Mockito v1.9.5的验证)在执行传递Foo.deinit()后调用接口栏中带有签名deinit()的方法,并且我遇到了一个我真的不理解的错误 下面是我正在尝试运行的FooTest.java: @RunWith(JukitoRunner.class) public class FooTest { @Inject private Foo foo; @Inject private Bar bar; public sta

我正在尝试做一个测试,验证(使用Mockito v1.9.5的
验证
)在执行传递
Foo.deinit()
后调用接口
中带有签名
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(); 
    }
}
问题: 是什么导致未完成的VerificationException以及如何修复它


我是个新手,所以我很可能错过了一些基本的东西。如果我能提供更多信息,请告诉我。很抱歉,如果已经回答了这个问题,那么我误解了这里的答案。

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

此外,出现此错误可能是因为您验证了以下任一项: final/private/equals()/hashCode()方法。这些方法是不可能的 存根/核实


实际上,您尝试隐式地验证对
BarImpl#deinit
的调用,这是一个
final
方法,并且
Mockio
不支持
final
方法模拟。如果你想验证它,你需要从
BarImpl#deinit
的声明中删除关键字
final
,或者改用它。

在我的例子中,我得到它是因为我试图在间谍(而不是模拟)上执行verify()。我在做:

mySpy = Mockito.spy(<<constructor>>);
mySpy=Mockito.spy();
我不得不这样做:

mySpy = mock(MyClass.class, delegatesTo(<<constructor>>)
mySpy=mock(MyClass.class,delegatesTo())

如果所有低代表性用户都能写出这样的问题,世界将是一个完美的地方。+1