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