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