在 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
的实例“注入”到您的方法中。
您可以通过多种方式进行。例如下面两个之一
- 添加新的方法参数。
def sendSlackMessage(
channel: String,
message: String,
webhook: String,
api: SlackApi
):Boolean
- 使
object slack
成为class Slack(api: SlackApi)
在这两种情况下,您都可以提供 mock[SlackApi]
的模拟实例并控制方法 call
的预期。
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
的实例“注入”到您的方法中。
您可以通过多种方式进行。例如下面两个之一
- 添加新的方法参数。
def sendSlackMessage(
channel: String,
message: String,
webhook: String,
api: SlackApi
):Boolean
- 使
object slack
成为class Slack(api: SlackApi)
在这两种情况下,您都可以提供 mock[SlackApi]
的模拟实例并控制方法 call
的预期。