验证重载函数的 no arg 版本是否在 scalamok 中被调用



我正在使用scalamock,并试图验证RabbitMQ com.rabbitmq.client.Channel类中的close()方法是否被调用。问题是close()方法重载了两个选项:close()close(int, String)。我想验证是否调用了无 arg 版本。

我尝试了以下代码:

import com.rabbit.client.Channel
import org.scalatest.Wordspec
import org.scalamock.scalatest.MockFactory
class MessageSubscriberSpecs extends WordSpec with MockFactory {
  "A message subscriber" when {
    "closing a connection" should {
      // ... More test setup
      "close the underlying connection" in {
        val channelStub = stub[Channel]
        (channelStub.close _).verify()
      }
    }
  }
}

带有 verify() 的行无法编译,因为编译器对要调用哪个重载函数感到困惑。

如何验证是否调用了重载函数的 no arg 版本?

可以为函数添加显式类型注释。在这种情况下,它是一个具有 void 返回类型的 no args 方法,因此它将是:

(channelStub.close _: () => Unit).verify()

同样,为了匹配其他重载的签名,它将是

(channelStub.close _: (Int,String) => Unit).verify(*,*)

是的,它混淆了它应该创建哪个函数:Function0Function2(即具有 0 或 2 个参数的函数)

因此,让我们通过显式定义一个参数为 0 的函数来解决这个问题!

(() => channelStub.close()).verify()

最新更新