Как загрузить конфигурацию для каждого тестового сценария? - PullRequest
1 голос
/ 10 июня 2019

Я использую Акку и хотел бы проверить своих актеров.Тест выглядит следующим образом:

import akka.testkit._
import com.sweetsoft._
import org.scalatest.Assertion
import com.typesafe.config.{Config, ConfigFactory}
import org.testcontainers.containers.KafkaContainer

import concurrent.duration._

final class DetectorSpec extends BddSpec {


  private val sapMock = new SapMock()
    .withExposedPorts(8080)

  private val kafkaMock = new KafkaContainer()

  private val config: String => String => Config = kafka => sap =>
    ConfigFactory.parseString(
      s"""
         |kafka {
         |  servers = "$kafka"
         |}
         |
      |sap {
         |  server = "ws://${sap}"
         |}
         |
  """)


  private val listener1 = TestProbe()
  private val listener2 = TestProbe()

  private val detector = system.actorOf(DetectorSupervisor.props)

  after {
  }

  override def beforeAll(): Unit = {

  }


  override def afterAll(): Unit = {
    TestKit.shutdownActorSystem(system)
  }


  feature("Detect Kafka and SAP availability") {
    info("As a technical user, I want to be notified in real time, if Kafka and SAP is up and running or not.")
    scenario("SAP and Kafka are offline") {


      Given("I am registering two listeners")
      detector ! AddNewListener(listener1.ref)
      detector ! AddNewListener(listener2.ref)
      When("I am receive the state message")
      val res1 = listener1.expectMsgPF[Assertion](2.second) _
      val res2 = listener2.expectMsgPF[Assertion](2.second) _
      Then("it should contain `Kafka and SAP are offline`")
      res1 {
        case status: ServerStatus =>
          status.health should be(ServersOffline)
      }
      res2 {
        case status: ServerStatus =>
          status.health should be(ServersOffline)
      }
    }

    scenario("SAP is online and Kafka is offline") {
      sapMock.start()
      Given("I am waiting for the current state message")
      detector ! AddNewListener(listener1.ref)
      When("I am receive the state message")
      val res1 = listener1.expectMsgPF[Assertion](2.second) _
      Then("it should contain `Kafka is offline`")
      res1 {
        case status: ServerStatus =>
          sapMock.stop()
          status.health should be(ServersOffline)
      }
    }

    scenario("SAP is offline and Kafka is online") {
      Given("I am waiting for the current state message")
      When("I am receive the state message")
      Then("it should contain `SAP is offline`")
      cancel()
    }

    scenario("SAP and Kafka are available") {
      Given("I am waiting for the current state message")
      When("I am receive the state message")
      Then("it should contain `SAP and Kafka are online`")
      cancel()
    }
  }
}

Как видите, я использую testcontainer для построения тестовой среды.Я хотел бы запустить контейнер только по определенному сценарию и по сценарию, я хотел бы ввести конфигурацию .

Например, сценарий scenario("SAP and Kafka are offline") имеет конфигурацию, отличную от scenario("SAP is online and Kafka is offline").

Вопрос в том, как загрузить разные конфигурации по другому сценарию?

На веб-сайте akka показано, как загрузить конфигурацию, следующим образом:

import akka.actor.ActorSystem
import com.typesafe.config.ConfigFactory
val customConf = ConfigFactory.parseString("""
  akka.actor.deployment {
    /my-service {
      router = round-robin-pool
      nr-of-instances = 3
    }
  }
  """)
// ConfigFactory.load sandwiches customConfig between default reference
// config and default overrides, and then resolves it.
val system = ActorSystem("MySystem", ConfigFactory.load(customConf))

Почему я должен делать это таким образом, поскольку порт контейнера доступен только приконтейнер запущен, и я не хочу запускать контейнер для каждого сценария.

Класс BddSpec:

abstract class BddSpec extends TestKit(ActorSystem("PluggerSystem"))
  with AsyncFeatureSpecLike
  with Matchers
  with GivenWhenThen
  with BeforeAndAfter
  with BeforeAndAfterAll
...