【问题标题】:Mockito cannot seem to mock slf4j interfaceMockito 似乎无法模拟 slf4j 界面
【发布时间】:2021-11-24 06:13:55
【问题描述】:

我正在尝试为 slf4j Logger 接口制作一个包装器并对其进行测试,但我不断收到以下错误。

TestDebugLog FAILED
    Wanted but not invoked:
    logger.debug("some message", "arg1", "arg2");
    -> at com.common.TrebuchetLoggerTest.TestDebugLog(TrebuchetLoggerTest.java:37)

    However, there was exactly 1 interaction with this mock:
    logger.debug("some message", "arg1", "arg2");
    -> at com.common.TrebuchetLogger.debug(TrebuchetLogger.java:19)
        at com.common.TrebuchetLoggerTest.TestDebugLog(TrebuchetLoggerTest.java:37)

1 test completed, 1 failed

我的测试看起来像

@RunWith(MockitoJUnitRunner.class)
public class TrebuchetLoggerTest {
  TrebuchetLogger trebuchetLogger;
  @Mock TrebuchetClient trebuchetClient;
  @Mock Logger logger;

  @Before
  public void setup() {
    trebuchetClient = mock(TrebuchetClient.class);
    when(trebuchetClient.launch(any(String.class))).thenReturn(true);
    logger = mock(Logger.class);
    trebuchetLogger = new TrebuchetLogger(trebuchetClient, logger);
  }

  @Test
  public void TestDebugLog() {
    trebuchetLogger.debug("debug-suffix", "some message", "arg1", "arg2");
    verify(logger).debug("some message", "arg1", "arg2");
  }
}

我的代码是:

package com.common;

import org.slf4j.Logger;
import lombok.NonNull;
import com.trebuchet.client.TrebuchetClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import javax.inject.Inject;
import org.slf4j.LoggerFactory;

@RequiredArgsConstructor(onConstructor = @__(@Inject))
public class TrebuchetLogger {
  @NonNull private TrebuchetClient trebuchetClient;
  @NonNull private Logger log;

  public void debug(String trebuchetSuffix, String format, Object... arguments) {
    if (trebuchetClient.launch(trebuchetSuffix)) {
      log.debug(format, arguments);
    }
  }

  public void info(String trebuchetSuffix, String format, Object... arguments) {
    if (trebuchetClient.launch(trebuchetSuffix)) {
      log.info(format, arguments);
    }
  }

  public void warn(String trebuchetSuffix, String format, Object... arguments) {
    if (trebuchetClient.launch(trebuchetSuffix)) {
      log.warn(format, arguments);
    }
  }

  public void error(String trebuchetSuffix, String format, Object... arguments) {
    if (trebuchetClient.launch(trebuchetSuffix)) {
      log.error(format, arguments);
    }
  }
}

为什么我的 mockito 模拟失败并在错误消息中显示看似相同的结果?

【问题讨论】:

    标签: unit-testing mockito slf4j


    【解决方案1】:

    您正在 SUT 中调用不同的重载并进行验证。

    // SUT
    log.debug(format, arguments);
    
    // Test
    verify(logger).debug("some message", "arg1", "arg2");
    

    对应重载:

    如果需要在有格式和 2 个参数时调用 varargs-overload,则需要将参数作为数组传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多