【问题标题】:How to call a curried function on a mock?如何在模拟上调用咖喱函数?
【发布时间】:2021-03-16 19:44:27
【问题描述】:

我有一个看起来像这样的通用函数

  def getFromCacheOrCallService[T: ClassTag](cacheKey: String, duration: Duration = cacheDefaultDuration)(
      callServiceToFetchValue: => Try[T]
  ): Try[T]

我试图弄清楚如何以始终调用callServiceToFetchValue 并使用它的方式模拟此函数。到目前为止我有这个

doAnswer(invocation => {
  invocation.getArgumentAt(1, classOf[() => Try[marketplace]])()
}).when(marketplaceCache).cacheable(any(), any())(any())(any())

如果我理解我所做的正确应该调用传递的函数,但是每当我尝试运行时都会收到此错误

Invalid use of argument matchers!
4 matchers expected, 3 recorded:

为什么说它需要 4 个匹配器?我有 4 个匹配器,我不明白问题出在哪里。

【问题讨论】:

    标签: scala testing mocking mockito


    【解决方案1】:

    问题不是柯里化函数,而是按名称传递的参数。 Mockito 不能很好地支持它,除了实际将该参数声明为实际函数() => Try[T] 之外,我不知道任何好的解决方法 (或者,也许,String => Try[T] - 如果没有传递密钥,它实际上看起来有点奇怪)。

    【讨论】:

    • 哦,那真是令人沮丧,至少有办法让匹配器工作吗?我仍然不明白为什么当有 4 个时它说只有 3 个
    • @DavidWolak 就像我说的,我不知道 :(
    【解决方案2】:

    对于遇到类似问题的任何人,我最终得到的解决方案是将getFromCacheOrCallService 的定义更改为

      def getFromCacheOrCallService[T: ClassTag](cacheKey: String, duration: Duration = cacheDefaultDuration)(
          callServiceToFetchValue:() => Try[T]
      ): Try[T]
    

    然后它起作用了。然而,由于大部分时间我都在传递函数,比如

     def getFromCacheOrCallService("key", Duration(10, MINUTES)(callServiceToFetchValue(SomeInput)) 
    

    我不得不把它改成

     def getFromCacheOrCallService("key", Duration(10, MINUTES)({ () => callServiceToFetchValue(SomeInput)} ) 
    

    【讨论】:

      猜你喜欢
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 2022-01-02
      相关资源
      最近更新 更多