specs2在示例之前运行方法之后

时间:2014-01-16 06:40:34

标签: scala testing specs2

我有以下测试:

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

2 个答案:

答案 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)

简单回答,看起来不能这样做。