Scala 如何用Mockito模拟扩展trait中的方法

Scala 如何用Mockito模拟扩展trait中的方法,scala,unit-testing,mockito,scalatest,traits,Scala,Unit Testing,Mockito,Scalatest,Traits,我怎样才能用mockito模仿依赖的特征? 我有两个特点: trait A { def a = 1 } trait B extends A { def b = { // do things a // do things } } 现在,我想测试特征B。我想验证A.A()是否被调用: class SmallTest extends FunSuite with MockitoSugar { test("prove, th

我怎样才能用mockito模仿依赖的特征? 我有两个特点:

 trait A {
    def a = 1
  }

  trait B extends A {
    def b = {
      // do things
      a
      // do things
    }
  }
现在,我想测试特征B。我想验证A.A()是否被调用:

class SmallTest extends FunSuite with MockitoSugar {
  test("prove, that a gets called") {
    val mockA = mock[A]
    val b = new B with mockA {}  // This won't compile
    b.b
    verify(mockA).a
  }
}

此示例无法编译。但是,否则我将如何“注入”我的mock呢?

好的,找到了一种方法。这会奏效的。可能有点不舒服,如果有很多方法,我必须重写。。。 在本例中,我将方法参数添加到要模拟的方法中,以显示重复,这看起来不太好

  trait A {
    def a(i: Int) = i + 1
  }

  trait B extends A {
    def b(j: Int) = {
      // do things
      a(j)
      // do things
    }
  }

  test("prove, that a gets called") {
    val mockA = mock[A]
    val b = new B {
      override def a(j: Int) = mockA.a(j)
    }
    b.b(1)
    verify(mockA).a(1)
  }

使用间谍将是一个更好的选择

我也一样。间谍的问题是,他们仍然调用真实的代码,在本例中我不想这样做,因为我要验证的方法与数据库有交互。
// the class being spied cannot be final,
// so we cannot do this:
// spy(new B {})

class C extends B

val c = spy(new C)
c.b
verify(c).a