gpt4 book ai didi

java - 使用 Mockito 测试 j.u.f.Supplier 的惰性初始化

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:15 24 4
gpt4 key购买 nike

我有一个 Sut 类,它使用 java.util.function.Supplier 实现延迟初始化。事实上它比下面的代码更复杂,但这是 Mockito 无法测试的最简单的形式。下面的测试抛出错误 Wanted but not invoked ... 但是,还有其他与此 mock 的交互。为什么 Mockito 不计算 create 的调用?代码流实际上进入了create();我用调试器检查过。

import java.util.function.Supplier;

import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

public class TestTimes {

@Test
public void testCreateOnlyOnce() {
Sut sut = spy(new Sut());
sut.getData();
sut.getData();
sut.getData();
verify(sut, times(1)).create();
}

private static class Sut {
Supplier<Object> data = this::create;

void getData() {
data.get();
}

Object create() {
return new Object();
}
}
}

最佳答案

首先,感谢您提出的问题。

我自己测试了你的代码,看到了你提到的错误。虽然,我在调试时稍微更改了您的代码...看看:

    @Test
public void testCreateOnlyOnce() {
Sut sut = spy(new Sut());
sut.getData();
sut.getData();
sut.getData();
verify(sut, times(1)).create();
}

private static class Sut {

private Supplier<Object> data;

// Added de data object initialization on the constructor to help debugging.
public Sut() {
this.data = this::create;
}

void getData() {
data.get();
}

Object create() {
return new Object();
}
}

我在调试时发现了什么:

  1. Sut 类构造函数在 spy(new Sut()) 子句中被正确调用,但是 create() 方法是没有被叫到那里。
  2. 每次调用 sut.getData() 时,也会调用 create() 方法。是什么让我最终得出结论:

On the constructor, all that this::create did was telling java that, whenever it needs to retrieve the Object from the supplier, that Object will be retrieved from the create() method. And, the create() method being called by the supplier is from a class instance different from what Mockito is spying.

这就解释了为什么你不能用验证来跟踪它。

编辑:根据我的研究,这实际上是供应商期望的行为。它只是创建一个接口(interface),该接口(interface)具有一个 get() 方法,该方法调用您在方法引用上声明的任何 noArgs 方法。看看this关于“使用方法引用实例化供应商”。

关于java - 使用 Mockito 测试 j.u.f.Supplier 的惰性初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56780901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com