【问题标题】:specs2 After method runs before the examplespecs2 After 方法在示例之前运行
【发布时间】: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 变得懒惰?
  • 因为将所有内容标记为懒惰然后在某处触发很烦人。另外,我认为这有点违背了延迟初始化方法的目的。

标签: scala testing specs2


【解决方案1】:

您应该为Context 使用特征而不是类。如果你使用一个类,delayedInit(因此after)将被触发两次。一次用于Context 类的主体,另一次用于匿名类new Context 的主体。使用 trait 你不会有这样的行为:

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
  }
}

【讨论】:

  • 取自 scala 文档 (scala-lang.org/files/archive/nightly/docs/library/…) - “继承 DelayedInit 标记特征的类和对象(但请注意,不是特征)将重写其初始化代码,如下所示:代码变为延迟初始化(代码) ”。据我了解,这意味着除非将 Context 定义为类,否则延迟初始化代码将不起作用。我将更改上面的示例,以便更好地强调问题。
  • 对,但是当你写 new Context 时,你会创建一个匿名类。
  • 好点。然而,有些东西仍然分崩离析。当事情变得有点复杂时,我会尝试调整我的示例以更好地强调问题。
【解决方案2】:

简单的回答,貌似这个不行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多