0

我在 A.scala 类中有一段 scala 代码有一个案例类 Case1,其中包含 f1 的字段 Future,它是另一个案例类 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 类的模拟调用与实际调用不匹配的消息。它打印 Expected 和 Actual 但它们在日志中看起来相同。

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

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

4

1 回答 1

2

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

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

只是忘记在他们身上使用游行者(无论是为了断言还是为了嘲笑)。

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

您的代码失败,因为在您的模拟中,您与某个 Future 值匹配(同样,您无法可靠地比较这些 Future 值,并且模拟在内部使用一些==来了解现在是否是返回模拟值的时刻)。

因此,请尝试接受任何

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

如果在您的情况下这是不可接受的,您可能想expects(*)用类似expects(where(future => Await.result(future) == something)).

于 2018-09-01T23:19:26.177 回答