Scalamock无法区分期货

时间:2018-09-01 17:42:32

标签: scala scalatest case-class stubbing scalamock

我在A.scala类中有一段scala代码 有一个案例类Case1,其中包含字段f1,它是另一个案例类Case2的类型。 Case2包含Seq [String]。 我将case2对象发送到实例为b的另一个类B

case class Case2(list: Seq[String])
case class Case1(f1: Future[Case2])

class A(b: B) {
   def doSomething() {
     val case1 = Case1(Future(Case2(List("Hello")))
     val result = b.doSomethingElse(case1)   // Another future returned
     result
  }
}

class ATest extends .... Some scalatest libraries {
    val bMock = mock[B]
    val a = new A(bMock)
    "A" should {
        "call b" in  {
            val case1 = Case1(Future(Case2(List("Hello")))
            val result = .....Anything....
            (b.doSomethingElse _).expects(case1).returning(Future.successful(result))
             a.doSomething().futureValue shouldBe .....Something
      }
    }
 }

测试失败,并显示一条消息,提示对B类的模拟调用与实际调用不匹配。它会打印“期望”和“实际”,但两者在日志中看起来都一样。

理想情况下,测试应通过,因为对B的模拟调用与对B的实际调用相匹配。但是我怀疑这是因为Case1包含了一个Future,它将它视为另一个对象。当我替换通配符即   (b.doSomethingElse _).expects(*).returning(result)

有没有办法通过这项测试? 我将scalaMock用于模拟目的。

1 个答案:

答案 0 :(得分:2)

您无法可靠地检查任何函数或正在进行的计算是否相等,因此:

  • 未来
  • 任务
  • 免费monads
  • DBIO
  • 功能类型

只需忘记在它们上使用游行者(用于断言和嘲笑)。

对于断言,您唯一可以做的可靠的事情就是运行它/实现结果并延迟断言直到获得一些实际值。

您的代码失败,因为在您的模拟中您匹配了某个Future值(再次,您无法可靠地进行比较,并且内部模拟使用了==来模拟现在是否是返回模拟值的时刻)。 / p>

因此,请尝试接受任何

(b.doSomethingElse _).expects(*).returning(Future.successful(result))

如果您的情况不可接受,则可能要用expects(*)之类的内容替换expects(where(future => Await.result(future) == something))