Scalamock无法区分期货

问题描述 投票:0回答:1

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

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

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

scala scalatest case-class stubbing scalamock
1个回答
2
投票

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

  • 期货
  • 任务
  • 免费monad
  • DBIO
  • 功能类型

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

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

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

所以相反,尝试接受任何价值

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

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

© www.soinside.com 2019 - 2024. All rights reserved.