Mockito 5.x.x由于log方法内部的模拟交互而导致Junit测试失败

exdqitrt  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(68)

升级到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中一样?

jhiyze9q

jhiyze9q1#

首先,Mockito 4跳过模拟交互的原因与日志记录无关。事实上,当你运行这条线时:

logger.info("name ={}", mockThread.getName() );   //org.slf4j.Logger

你没有从log方法调用mockThread.getName()。实际上,您直接从测试方法调用它,获取结果字符串并将其传递给log方法。
使用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之前,使您的测试通过。

相关问题