Отсутствует вызов метода для проверки (макет), но есть один?

Вступление

Я пытаюсь сделать тест, который проверяет (используя 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 и как его можно исправить?

Я новичок в Мокито, так что, скорее всего, я что-то упустил. Пожалуйста, дайте мне знать, если есть больше информации, которую я могу предоставить. Извините, если на этот вопрос уже был дан ответ, и я неправильно понял ответы здесь, на SO.

2 ответа

Решение

На самом деле ваша проблема в сообщении об ошибке:

Кроме того, эта ошибка может появляться, потому что вы проверяете любой из методов: final / private / equals () / hashCode (). Эти методы не могут быть проверены.

На самом деле вы пытаетесь неявно проверить вызовы BarImpl#deinit который является final метод и Mockio не поддерживает final Метод издевательства, как объяснено в док. Если вы хотите проверить это, вам нужно либо удалить ключевое слово final из декларации BarImpl#deinit или используйте вместо этого Powermock.

В моем случае я получал это, потому что я пытался сделать verify() для шпиона (а не для насмешки). Я делал:

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

Я должен был сделать это вместо этого:

mySpy = mock(MyClass.class, delegatesTo(<<constructor>>)
Другие вопросы по тегам