【发布时间】:2015-05-04 16:04:00
【问题描述】:
我有以下测试:
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)
}
}
}
}
我希望这个测试能够通过,但实际上发生的情况是由于延迟初始化,在示例之前运行之后。如果我将 Context 更改为 trait,我将失去延迟的初始化功能。这是一个错误还是我做错了什么?
**已编辑: 当 Context 是 trait 时,此示例将抛出 NPE。我期望发生的是,由于延迟初始化,上下文的构造函数,因此意味着 barReader.someBar 将仅在 barReader 被注入后运行。
谢谢 内塔
【问题讨论】:
-
您更新的示例对我来说似乎过于复杂。你能试试这样的吗:gist.github.com/etorreborre/8529040
-
不起作用。 Context 的构造函数在注入发生之前运行。
-
实际上,您的示例将导致惰性验证。我的不是,因为 val 并不懒惰,我试图避免这样做。
-
为什么不希望 val 变得懒惰?
-
因为将所有内容标记为懒惰然后在某处触发很烦人。另外,我认为这有点违背了延迟初始化方法的目的。