使用Scala自我类型/冷甜点模式嘲笑

时间:2018-12-13 04:38:06

标签: scala

我使用的冻糕模式如下:

trait A {
  def a: Future[String]
}

class B {
  this: A =>

  def get: Future[String] = a
}

我想创建A的模拟版本,以便在测试def a时可以使用Mockito控制B的结果,有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

在测试使用类X的实例的类Y时,我们通常会提供类Y的模拟实例。

在这里,您的B没有使用A的任何实例,它期望(强制)扩展B的任何内容也扩展A

此外,您会注意到您的课程B确实是不完整的。如果您选择创建B的实例,

val b = new B
// <console>:13: error: class B cannot be instantiated because it does not conform to its self-type B with A
//       val b = new B

所以。基本上,每当创建B的实例时,还必须提供A的实现。

scala> val b = new B with A { def a = Future.successful("well") }
// b: B with A = $anon$1@11ad095c

请注意,每当创建B的任何实例时,我们如何自由提供A的任何实现。

您可以通过这种方式提供测试用例所需的任何内容。

所以

trait AWithMockedBehaviour1 extends A {
  def a = Future.successful("mocked_1")
}

val b = new B with AWithMockedBehaviour1