如何测试可堆叠特征
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>
假设我有这样的特质:
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>