如何测试可堆叠特征

How to test stackable trait

假设我有这样的特质:

trait FooStackable {
  def foo: String
  def bar: Double

  abstract override def logic(x: Double): Unit = {
    if (x < 0) println(foo)
    else super.logic(bar + x)
  }
}

我想在方法 logic 上以行为驱动的方式针对此特征编写测试:我想根据输入参数检查测试调用了哪些方法以及调用了多少次。显然不可能简单地实例化此特征的实例(即使覆盖未实现的方法),因此模拟也将不起作用。

写这样的测试场景有意义吗? (方法 logic 中的实际逻辑更复杂)如果是,如何单独测试可堆叠特征?

代码无法像写的那样编译。特别是,这个特征中没有 'super' 因为它不是从任何东西派生的。我做了一些更改来解决它:

trait Stackable {
  def logic(x: Double): Unit
}

trait FooStackable extends Stackable {
  def foo: String
  def bar: Double

  abstract override def logic(x: Double): Unit = {
    println("In FooStackable.logic()")

   if (x < 0) println(foo)
    else super.logic(bar + x)
  }
}

trait TestStackable extends Stackable {
  def logic(x: Double): Unit = {
   println("In TestStackable.logic()")
  }
}

object FooStackableTest extends TestStackable with FooStackable {
  def foo: String = "foo"
  def bar: Double = 1.234

  override def logic(x: Double): Unit = {
   println("In FooStackableTest.logic()")

   super.logic(x)   
  }
}

通过这些更改,FooStackable 现在位于 TestStackable(在基础 class 中实现 logic())和 FooStackableTest(实现 FooStackable 的其他未定义成员并覆盖 logic())之间:

scala> FooStackableTest.logic(4.0)
In FooStackableTest.logic()
In FooStackable.logic()
In TestStackable.logic()

scala> FooStackableTest.logic(-4.0)
In FooStackableTest.logic()
In FooStackable.logic()
foo

scala>