我需要编写集成测试,它需要启动服务器可执行文件。我想使服务器的位置可配置,以便我可以在我的盒子和集成服务器上设置它。
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
答案 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()
}