Scalamock 无法区分期货

Scalamock cannot differentiate the Futures

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

的 class 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
      }
    }
 }

测试失败并显示一条消息,表明对 Class B 的模拟调用与实际调用不匹配。它打印 Expected 和 Actual 但它们在日志中看起来相同。

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

有没有办法通过这个测试? 我使用 scalaMock 进行模拟。

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

  • 期货
  • 任务
  • 免费单子
  • DBIO
  • 函数类型

忘记对它们使用 marcher(用于断言和模拟)。

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

你的代码失败了,因为在你的模拟中你匹配了一些 Future 值(同样,你不能可靠地比较和模拟内部使用一些 == 来知道现在是否是 return 模拟值)。

所以尝试接受任何

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

如果这在您的情况下是不可接受的,您可能希望将 expects(*) 替换为 expects(where(future => Await.result(future) == something)).