如何运行 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)
}
我需要编写一个集成测试,它需要启动一个服务器可执行文件。我想让服务器的位置可配置,这样我就可以在我的盒子和集成服务器上设置它。
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)
}