6

我正在尝试使用 Akka 的 TestKit 进行 specs2 测试。我被困在一个持久的编译错误上,我不知道如何解决,我很感激建议。

编译错误是:

TaskSpec.scala:40: parents of traits may not have parameters
[error]   with akka.testkit.TestKit( ActorSystem( "testsystem", ConfigFactory.parseString( TaskSpec.config ) ) )

根据Akka docs和 internet xebia和 Akka in Action 的建议,我正在尝试将 TestKit 合并到 specs2 Scope 中。这是我收到错误的代码片段:

class TaskSpec 
extends Specification 
with AsyncTest
with NoTimeConversions { 

  sequential 

  trait scope 
  extends Scope 
  with TestKit( ActorSystem( "testsystem", ConfigFactory.parseString( TaskSpec.config ) ) ) 
  with AkkaTestSupport {
...

我有以下帮手:

trait AkkaTestSupport extends After { outer: TestKit =>
  override protected def after: Unit = {
    system.shutdown()
    super.after
  }
}
4

1 回答 1

6

这是您可以做的一件事:

import org.specs2.mutable.SpecificationLike
import org.specs2.specification._

class TestSpec extends Actors { isolated
  "test1" >> ok
  "test2" >> ok
}

abstract class Actors extends 
 TestKit(ActorSystem("testsystem", ConfigFactory.parseString(TaskSpec.config)))
 with SpecificationLike with AfterExample {

  override def map(fs: =>Fragments) = super.map(fs) ^ step(system.shutdown, global = true)

  def after = system.shutdown
}

这应该避免您遇到的编译错误,因为TestKit它是一个抽象类并且它只是混合了特征:SpecificationLike是一个特征(Specification不是)并且AfterExample是一个特征。

上面的规范也在isolated模式下运行,这意味着每个示例都有一个全新的TestSpec对象实例化,并且该AfterExample特征确保系统在每个示例之后关闭。

最后,该map方法被一个特殊的方法覆盖,step以确保system为第一个TestSpec实例(声明所有示例的那个)创建的将被干净地处理掉。

于 2013-11-12T00:38:54.740 回答