如何测试可堆叠的特性

时间:2017-10-02 13:22:20

标签: scala scalatest

假设我有这样的特质:

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中的实际逻辑更复杂)如果是,可孤立测试可堆叠特征?

1 个答案:

答案 0 :(得分:0)

代码无法按编写方式编译。特别是,这种特性没有“超级”,因为它不是来自任何东西。我做了一些改变来解决它:

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(在基类中实现logic())和FooStackableTest(实现FooStackable的其他未定义成员并覆盖逻辑())之间的中间位置:

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>