gpt4 book ai didi

scala - Scalamock无法区分 future

转载 作者:行者123 更新时间:2023-12-03 10:07:13 24 4
gpt4 key购买 nike

我在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的模拟调用与实际不匹配。它打印“期望”和“实际”,但两者在日志中看起来都一样。

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

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

最佳答案

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

  • future
  • 任务
  • 免费monads
  • DBIO
  • 函数类型

  • 只是忘了在他们身上使用游行者(既可以断言也可以 mock )。

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

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

    因此,请尝试接受任何值
    (b.doSomethingElse _).expects(*).returning(Future.successful(result))

    如果这在您的情况下是 Not Acceptable ,则您可能需要将 expects(*)替换为 expects(where(future => Await.result(future) == something))

    关于scala - Scalamock无法区分 future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52130692/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com