'How to run ConfigMapWrapperSuite?

I need to write an integration test and it requires starting a server executable. I want to make location of the server configurable, so that I could set it on my box and on integration server.

ConfigMapWrapperSuite seems to be doing exactly what I want:

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

But when I set my IDE (IntelliJ) to execute all tests in the project, I get an exception saying that constructor with Map parameter not found. Looking into source code of scalatest revealed:

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

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

So in contrary to what documentation says, suite must have constructor with a Map and not ConfigMap.

Ok, I changed constructor to take a Map[String,String] but now I get NoSuchElementException at val consulPath = configMap("consul.path"). Lookung up the stack down to ConfigMapWrapperSuite and I see that constructor.newInstance(Map.empty) WTF? So wrapped suite class is instantiated with empty map, and than another time, during the suite run with actual map of parameters? How do I suppose to get parameters if I'm given an empty map?

I looked up scalatest's unit tests. They are so rudimentary that actually retrieving a value from configMap is not performed.

I do not want to use ConfigMapFixture because it will make me initializing every single test with the same code.

So, how do I not only pass but also get global setting in test suite?

Scalatest version: 3.0.0-M15



Solution 1:[1]

Ok, answering my own question. ConfigMapWrapperSuite seems to be not used too much and essentially is broken. Instead I've used BeforeAndAfterAllConfigMap as in here:

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()
  }

Solution 2:[2]

You need override instance

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

  override def newInstance = new AcceptanceTest(configMap)

}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Vadym Chekan
Solution 2 Oleh Levkivskyi