如何通过 Mockito 的功能接口验证方法调用?
How to verify a method call through a functional interface with Mockito?
我正在使用 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。
有什么想法吗?
我假设您的测试代码如下所示:
MyClass spiedOnObject = spy(new MyClass());
spiedOnObject.getFoo();
verify(spiedOnObject , times(1)).initFoo();
问题是 this.fooGetter = this::initFoo;
在您开始监视对象之前被调用。此时this
指的是真实对象,不是间谍。并且在创建方法引用时捕获该引用。因此无法注册呼叫。
我正在使用 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。
有什么想法吗?
我假设您的测试代码如下所示:
MyClass spiedOnObject = spy(new MyClass());
spiedOnObject.getFoo();
verify(spiedOnObject , times(1)).initFoo();
问题是 this.fooGetter = this::initFoo;
在您开始监视对象之前被调用。此时this
指的是真实对象,不是间谍。并且在创建方法引用时捕获该引用。因此无法注册呼叫。