如何运行 ConfigMapWrapperSuite?

How to run ConfigMapWrapperSuite?

我需要编写一个集成测试,它需要启动一个服务器可执行文件。我想让服务器的位置可配置,这样我就可以在我的盒子和集成服务器上设置它。

ConfigMapWrapperSuite 似乎正在做我想做的事情:

@WrapWith(classOf[ConfigMapWrapperSuite])
class ConsulTest(configMap: ConfigMap) extends FlatSpec with ShouldMatchers {
  val consulPath = configMap("consul.path")
  "Consul" should "list keys under root" in {
      ...
  }

但是当我设置我的 IDE (IntelliJ) 来执行项目中的所有测试时,我得到一个异常,指出未找到带有 Map 参数的构造函数。查看 scalatest 的源代码显示:

final class ConfigMapWrapperSuite(clazz: Class[_ <: Suite]) extends Suite {

  private lazy val wrappedSuite = {
    val constructor = clazz.getConstructor(classOf[Map[_, _]])
    constructor.newInstance(Map.empty)
  }

所以与文档所说的相反,套件必须具有带有 Map 而不是 ConfigMap 的构造函数。

好的,我更改了构造函数以采用 Map[String,String] 但现在我在 val consulPath = configMap("consul.path") 处得到了 NoSuchElementException。在堆栈中查找 ConfigMapWrapperSuite,我看到 constructor.newInstance(Map.empty) WTF?所以包装套件 class 是用空映射实例化的,而不是另一次,在套件 运行 中用实际参数映射实例化?如果给我一张空地图,我该如何获取参数?

我查阅了 scalatest 的单元测试。它们是如此简陋,以至于实际上并没有执行从 configMap 中检索值。

我不想使用 ConfigMapFixture 因为它会让我用相同的代码初始化每个测试。

那么,如何在测试套件中既通过又获得全局设置?

最新版本:3.0.0-M15

好的,回答我自己的问题。 ConfigMapWrapperSuite 好像用得不多,基本坏掉了。 相反,我在这里使用 BeforeAndAfterAllConfigMap

class ConsulTest extends FlatSpec with ShouldMatchers with OneInstancePerTest with BeforeAndAfterAllConfigMap {
  var consulProcess: Process = null
  override def beforeAll(conf: ConfigMap): Unit = {
    consulProcess = Seq("bin/"+exe, "agent", "-advertise", "127.0.0.1", "-config-file", "bin/config.json").run()
  }

  override def afterAll(conf: ConfigMap): Unit = {
    consulProcess.destroy()
  }

您需要覆盖实例

@WrapWith(classOf[ConfigMapWrapperSuite])
class AcceptanceTest(configMap: Map[String, Any])
  extends FlatSpec
    with OneInstancePerTest {

  override def newInstance = new AcceptanceTest(configMap)

}