Я использую Акку и хотел бы проверить своих актеров.Тест выглядит следующим образом:
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