Как проверить вызов метода через функциональный интерфейс с Mockito?
Я использую поставщика для создания безопасного потока потока, избегая при этом последовательных вызовов синхронизированного метода.
class MyClass extends AbstractClassWithContext {
Supplier<Foo> fooGetter;
Foo foo;
public MyClass() {
this.fooGetter = this::initFoo;
}
Foo getFoo(){
return fooGetter.get();
}
synchonized Foo initFoo(){
if(Objects.isNull(this.foo)) {
this.foo = getContext().getFoo();
}
this.fooGetter = () -> this.foo;
return this.foo;
}
}
Когда я запускаю свои модульные тесты, я хочу убедиться, что initFoo() вызывается ровно один раз. грустно verify(classUnderTest, times(1)).initFoo()
не регистрирует, что введен initFoo. Я отладил это и звоню getFoo()
в свою очередь вводит initFoo.
Есть идеи?
1 ответ
Решение
Я предполагаю, что ваш тестовый код выглядит примерно так:
MyClass spiedOnObject = spy(new MyClass());
spiedOnObject.getFoo();
verify(spiedOnObject , times(1)).initFoo();
Проблема в том, что this.fooGetter = this::initFoo;
вызывается до того, как вы начнете шпионить за объектом. С этой точки зрения this
относится к реальному объекту, а не к шпиону. И эта ссылка фиксируется при создании ссылки на метод. Поэтому звонок не может быть зарегистрирован.