我正在尝试进行一项测试,验证(使用Mockito v1.9.5的verify
)在执行后调用接口deinit()
中带有签名Bar
的方法传递Foo.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 newb所以我很可能错过了一些基本的东西。如果我能提供更多信息,请告诉我。对不起,如果已经回答了这个,我在这里误解了答案。
答案 0 :(得分:3)
实际上您的问题出现在错误消息中:
此外,此错误可能会显示,因为您验证以下任一项: final / private / equals()/ hashCode()方法。那些方法不能 存根/验证。
确实,您尝试隐式验证对BarImpl#deinit
的调用,这是一种 final
方法,Mockio
不支持final
方法嘲笑解释into the doc。如果您想验证它,则需要从final
声明中删除关键字BarImpl#deinit
或改为使用Powermock。
答案 1 :(得分:1)
在我的情况下,我得到了这个,因为我试图对间谍(而不是模拟)进行验证()。我在做:
mySpy = Mockito.spy(<<constructor>>);
我不得不这样做:
mySpy = mock(MyClass.class, delegatesTo(<<constructor>>)