5

序章

パススルーの実行後にインターフェイス内のverifyシグネチャを持つメソッドが呼び出されることを (Mockito v1.9.5 を使用して) 検証するテストを作成しようとしていますが、本当に理解できないエラーが発生しています。 .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 の初心者なので、基本的なことを見逃している可能性が非常に高いです。他に提供できる情報があればお知らせください。これがすでに回答されている場合は申し訳ありませんが、ここで回答を誤解しています。

4

2 に答える 2

4

実際にあなたの問題はエラーメッセージにあります:

また、最終的な/private/equals()/hashCode() メソッドのいずれかを検証したために、このエラーが表示される場合があります 。これらのメソッドはスタブ/検証できません。

実際BarImpl#deinitfinalメソッドであるへの呼び出しを暗黙的に検証しようとしており、ドキュメントに説明されているようにメソッドのモックをMockioサポートしていません。それを確認したい場合は、宣言からキーワードを削除するか、代わりにPowermockを使用する必要があります。finalfinalBarImpl#deinit

于 2016-10-31T21:08:54.933 に答える
1

私の場合、(モックではなく) スパイで verify() を実行しようとしていたため、これを取得していました。やっていた:

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

代わりにこれをしなければなりませんでした:

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