Как проверить вызов метода через функциональный интерфейс с 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 относится к реальному объекту, а не к шпиону. И эта ссылка фиксируется при создании ссылки на метод. Поэтому звонок не может быть зарегистрирован.

Другие вопросы по тегам