如何使用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。

有什么想法吗?

我假设您的测试代码看起来像这样:

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

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

相关内容

  • 没有找到相关文章