升级到 Mockito 5.x.x 后,测试用例开始无法显示模拟上的交互,日志消息中提到。
在 Mockito 5.x.x 之前,以下代码工作正常。
@Test
void name() {
Thread mockThread = Mockito.mock(Thread.class);
logger.info("name ={}", mockThread.getName() ); //org.slf4j.Logger
mockThread.start();
Mockito.verify(mockThread).start();
Mockito.verifyNoMoreInteractions(mockThread);
}
是否可以像 Mockito 4.x.x 中那样跳过日志消息中未计数的模拟交互?
首先,Mockito 4 跳过模拟交互的原因与日志记录无关。事实上,当你运行这一行时:
logger.info("name ={}", mockThread.getName() ); //org.slf4j.Logger
您没有从记录器中调用
mockThread.getName()
。事实上,您直接从测试方法调用它,获取结果字符串并将其传递给记录器。它返回的字符串不是“org.slf4j.logger”,而是“null” - 因为您正在调用模拟方法。如果您没有调用模拟方法,那么它将是“您的测试方法的线程名称”。
事实上,Mockito 4 的测试甚至通过了以下测试:
@Test
void name() {
Thread mockThread = Mockito.mock(Thread.class);
String x = mockThread.getName();
mockThread.start();
Mockito.verify(mockThread).start();
Mockito.verifyNoMoreInteractions(mockThread);
}
原因似乎是 Mockito 4 由于某种奇怪的原因没有将
Thread.getName()
注册为调用。这似乎是一个错误或不直观的行为,我建议升级到 Mockito 5 并添加
Mockito.verify(mockThread).getName();
在
verifyNoMoreInteractions
之前让您的测试通过。