在 Scala 函数中模拟 API 调用的正确方法

Right way to mock API calls inside a Scala function

object slack extends Logging{

  def sendSlackMessage(
    channel: String,
    message: String,
    webhook: String
  ):Boolean = {

    if(StringUtils.isNoneEmpty(channel, message, webhook)) {

      val api = new SlackApi(webhook)

      val slackMessage = new SlackMessage()
      slackMessage.setChannel(channel)
      slackMessage.setText(message)

      val results: Try[Unit] = Try(api.call(slackMessage))
      results match {
        case Failure(exception) =>
          logError("Invalid channel/webhook. Couldn't sent notification!", exception)
          false
        case Success(value) =>
          true
      }
    }

    else {
      logError("Invalid parameters. Couldn't sent notification!")
      false
    }
  }
}

我想知道是否可以进行单元测试 sendSlackMessage()。我现在面临的挑战是我无法找到一种方法来模拟 new SlackApi() 并且即使我进行了模拟,我也不知道如何告诉函数使用模拟值来实例化并使 api呼唤。

您需要能够将 new SlackApi 的实例“注入”到您的方法中。

您可以通过多种方式进行。例如下面两个之一

  1. 添加新的方法参数。
def sendSlackMessage(
    channel: String,
    message: String,
    webhook: String,
    api: SlackApi
  ):Boolean
  1. 使object slack成为class Slack(api: SlackApi)

在这两种情况下,您都可以提供 mock[SlackApi] 的模拟实例并控制方法 call 的预期。