我有以下测试:
class Foo extends mutable.SpecificationWithJUnit {
sequential
"this example should run before the 'After' method" in new Context {
bar must beSome
}
class Context extends mutable.BeforeAfter with mutable.Around {
override def apply[T : AsResult](a: =>T): Result = {
lazy val result = super[Around].apply(a)
super[BeforeAfter].apply(result)
}
override def delayedInit(x: => Unit): Unit = around { try { before; x; Success() } finally { after }}
@Resource var barReader : BarReader = _
val bar = barReader.someBar
override def before : Any = { //some stuff}
def after: Any = {
bar = None
}
override def around[T : AsResult](t: =>T) = {
//spring context injection logic
AsResult.effectively(t)
}
}
}
}
我希望这个测试能够通过,但实际上会发生的事情是因为延迟了init,所以在示例之前运行了。如果我将Context更改为trait,则会丢失延迟的init功能。这是一个错误还是我做错了什么?
**编辑: 当Context是特征时,此示例将抛出NPE。我期望发生的是因为延迟初始化,Context的构造函数,因此barReader.someBar将仅在注入barReader之后运行。
由于 Netta
答案 0 :(得分:2)
您应该使用特征而不是Context
的类。如果您使用课程,delayedInit
(因此after
)将被触发两次。一次为Context
类的主体,另一次为匿名类new Context
的主体。有了特质,你就不会有这样的行为:
class Foo extends mutable.SpecificationWithJUnit {
sequential
"this example should run before the 'After' method" in new Context {
bar must beSome
}
trait Context extends mutable.After {
var bar : Option[String] = Some("bar")
def after: Any = bar = None
}
}
答案 1 :(得分:-2)
简单回答,看起来不能这样做。