如何运行ConfigMapWrapperSuite?

时间:2016-02-11 22:51:31

标签: scala scalatest

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

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],但现在我在NoSuchElementException得到val consulPath = configMap("consul.path")。向上查看堆栈到ConfigMapWrapperSuite,我看到constructor.newInstance(Map.empty) WTF?所以包装的套件类是用空地图实例化的,而另一次,在套件运行期间用实际的参数映射?如果给出一张空地图,我该如何获取参数呢?

我查看了最新的单位测试。它们非常简陋,实际上不会从configMap中检索值。

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

那么,我如何不仅通过测试套件而且还获得全局设置?

最新版本:3.0.0-M15

1 个答案:

答案 0 :(得分:0)

好的,回答我自己的问题。 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()
  }