【问题标题】:Mockito Scala Specs2 mocking complex functions (Play Framework)Mockito Scala Specs2 模拟复杂函数(Play 框架)
【发布时间】:2016-03-14 18:59:09
【问题描述】:

我正在尝试正确存根 Play 框架使用的 ehCache API。特别是,它的 getOrElse 函数带有签名:

def getOrElse[A: ClassTag](key: String, expiration: Duration)(orElse: => A) 

在我的规范 2 代码中,我有:

val mockCache = mock[EhCacheApi]
mockCache.getOrElse[???](anyString,anyObject[Duration])(???) returns 
[Object I'd like returned]

问题是是否可以为 ??? 使用匹配器部分,特别是对于柯里化参数部分。

CacheApi 函数的返回类型应该是 Future[Seq[Object]] 。

公共 git repo 链接:Github

【问题讨论】:

    标签: scala mockito specs2


    【解决方案1】:

    这行得通

    class VariationAssignmentSpec(implicit ee: ExecutionEnv) extends PlaySpecification with Mockito {
    
      case class Variation(id: Option[Long] = None)
    
      lazy val v1 = Variation(Option(1L))
      lazy val v2 = Variation(Option(2L))
    
      "Cache#getOrElse" should {
        "return correct result" in {
    
          val mockCache = mock[CacheApi]
    
          mockCache.getOrElse[Future[Seq[Variation]]](anyString, any[Duration])(any)(any) returns
            Future(Seq(v1, v2))
    
          val resultFuture: Future[Seq[Variation]] =
            mockCache.getOrElse("cache.key", 10.seconds)(Future(Seq(v1,v2)))
    
          resultFuture must equalTo(Seq(v1,v2)).await
        }
      }
    
    }
    

    【讨论】:

    • 我收到“对象 Future 中应用方法的参数缺失,如果您想将其视为部分应用的函数,请在此方法后面加上 `_'”,我的模拟行如下所示: mockCache.getOrElse[Future[Seq[Variation]]](anyString, any[Duration])(===(Future[Seq[Variation]])) 返回 Future(Seq(v1,v2))
    • 我想我对 getOrElse[A] 的“A”应该是什么感到困惑。
    • 对不起,我忘了传递orElse 参数。我希望这可行,因为使用 Mockito 的别名参数有点棘手。
    • 如果这仍然不起作用并且您的项目是公开的,请将链接发布到您的存储库。
    • 第二个any 匹配隐含的ClassTag
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多