Mockito 5.x.x 由于日志方法内的模拟交互而未能通过 Junit 测试

问题描述 投票:0回答:1

升级到 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 中那样跳过日志消息中未计数的模拟交互?

java mockito junit5 spring-test
1个回答
0
投票

首先,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
之前让您的测试通过。

© www.soinside.com 2019 - 2024. All rights reserved.