2

我正在使用 Supplier 实例化字段线程安全,同时避免连续调用同步方法。

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。

有任何想法吗?

4

1 回答 1

1

我假设您的测试代码如下所示:

MyClass spiedOnObject = spy(new MyClass());
spiedOnObject.getFoo();
verify(spiedOnObject , times(1)).initFoo();

问题是this.fooGetter = this::initFoo;在您开始监视对象之前调用它。这里this指的是真实对象,而不是间谍。并且在创建方法引用时会捕获该引用。因此无法注册呼叫。

于 2016-04-19T12:18:15.297 回答