Blog

Akka mit Specs2 testen

Age Mooij

Age Mooij

Aktualisiert Oktober 22, 2025
2 Minuten

In diesem Jahr habe ich an mehreren Systemen auf der Grundlage von Akka gearbeitet, in der Regel in Kombination mit dem hervorragenden Spray-Framework, um vollständig asynchrone, akteursgesteuerte REST-Server zu bauen. Alles in allem ist das sehr gut gelaufen, aber vor kurzem musste ich ein bestimmtes Rad zum dritten Mal neu erfinden (beim dritten Projekt), so dass ich dachte, es wäre vielleicht gut, darüber zu bloggen, damit auch andere davon profitieren können. Das Problem ist sehr einfach: Akka hat eine großartige Unterstützung für Unit-Tests, aber leider (für mich) basiert diese Unterstützung auf ScalaTest. Nun ist an ScalaTest nichts auszusetzen, aber ich persönlich ziehe es vor, meine Tests mit Specs2 zu schreiben, und es hat sich herausgestellt, dass die Kombination von Akka TestKit mit Specs2 ein wenig schwierig ist. In der Akka-Dokumentation werden diese Probleme zwar erwähnt und es wird ein kurzer Überblick über Möglichkeiten gegeben, sie zu umgehen, aber ich konnte online keinen aktuellen Beispielcode finden.

Ich sage "aktuell", weil einer der Haupt-Committer von Akka, Roland Kuhn, einmal einen specs2-Beispielcode committed hat, der aber leider später wieder verworfen wurde. Basierend auf diesem ursprünglichen Beispiel ist hier meine leicht verbesserte und kommentierte Version: [scala] import org.specs2.mutable. import org.specs2.time.NoTimeConversions import akka.actor. import akka.testkit. import akka.util.duration. / Eine kleine Klasse, die als Specs2 'Kontext' verwendet werden kann. / abstract class AkkaTestkitSpecs2Support extends TestKit(ActorSystem()) with After with ImplicitSender { // stellen Sie sicher, dass wir das Actor-System herunterfahren, nachdem alle Tests gelaufen sind def after = system.shutdown() } / Sowohl Akka als auch Specs2 fügen implizite Konvertierungen für das Hinzufügen von zeitbezogenen Methoden zu Int. Mischen Sie die Specs2-Eigenschaft NoTimeConversions ein, um einen Konflikt zu vermeiden. / class ExampleSpec extends Specification with NoTimeConversions { sequential // erzwingt, dass alle Tests sequentiell ausgeführt werden "Ein TestKit" sollte { / für jeden Fall, in dem Sie normalerweise "in" verwenden würden, benutzen Sie "in new AkkaTestkitSpecs2Support", um einen neuen 'Kontext' zu erstellen. / "richtig mit Specs2 Unit Tests arbeiten" in new AkkaTestkitSpecs2Support { within(1 second) { system.actorOf(Props(new Actor { def receive = { case x â‡' sender ! x } })) ! "hallo" expectMsgType[String] muss gleich "hallo" sein } } } } [/scala] Dieser kleine Trick mit dem Specs2-Kontext überbrückt die beiden Systeme und ermöglicht es Ihnen, normale Akka TestKit-basierte Tests zu schreiben, aber Specs2 als Testtreiber und Matcher-Bibliothek zu verwenden.

Verfasst von

Age Mooij

Contact

Let’s discuss how we can support your journey.