【发布时间】:2021-01-06 18:21:32
【问题描述】:
我在以下测试中注意到了这个问题:
verify(mockedObject).functionCall(argThat(inputStream -> {
final String content = ... // read the inputStream
assertEquals(expectedContent, content);
return true;
}));
尽管assertEquals 断言是真的,它实际上会失败。我调试测试,发现lambda函数到达了两次,第二次流的光标在流的末尾。这就是它失败的原因。
所以我必须先重置流:
verify(mockedObject).functionCall(argThat(inputStream -> {
inputStream.reset();
final String content = ... // read the inputStream
assertEquals(expectedContent, content);
return true;
}));
问题是,为什么 lambda 会被触发两次?这是设计使然吗?有文件吗?
Mockito 版本:2.22
Junit 版本:5.6.0
Java 版本:1.8
更新
该方法只调用一次,两次 lambda 调用的输入是完全相同的输入。实际上,它们是同一个对象。我唯一要做的就是重置流,因为它已被第一次 lambda 调用耗尽。
【问题讨论】:
-
完全随机猜测:你调用了多少
mockedObject的方法?是否有可能第二次调用方法是没有参数的? -
@Pelocho 一次,否则整个验证会失败,对吧?
verify(mockedObject)是verify(mockedObject, times(1))的别名。 -
@Sraw
times(1)考虑到您在argThat中执行的匹配。如果使用不同的输入调用了两次并且只有一个匹配,则验证成功。 -
@ttzn 谢谢,我可以确保两件事。首先,该方法只被调用一次。其次,同一输入触发了 lambda 两次,当我到达第二个 lambda 调用时,
inputStream与第一个完全相同。我将在问题中更新此信息。