This is an automated email from the ASF dual-hosted git repository.

mdedetrich pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-pekko.git


The following commit(s) were added to refs/heads/main by this push:
     new 3a8d86f8a6 Add ScalaTestWithActorTestKitBase trait to handle multiple 
extends
3a8d86f8a6 is described below

commit 3a8d86f8a6ed9040eb21acc5549c0187d3f7a66c
Author: Matthew de Detrich <[email protected]>
AuthorDate: Wed Apr 12 12:54:17 2023 +0200

    Add ScalaTestWithActorTestKitBase trait to handle multiple extends
---
 .../typed/scaladsl/ScalaTestWithActorTestKit.scala | 23 ++++++++++++-----
 .../scaladsl/ScalaTestIntegrationExampleSpec.scala | 29 +++++++++++++++++++---
 docs/src/main/paradox/typed/testing-async.md       | 11 ++++++++
 3 files changed, 54 insertions(+), 9 deletions(-)

diff --git 
a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestWithActorTestKit.scala
 
b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestWithActorTestKit.scala
index 8a28ed9588..384498a1b7 100644
--- 
a/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestWithActorTestKit.scala
+++ 
b/actor-testkit-typed/src/main/scala/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestWithActorTestKit.scala
@@ -38,13 +38,9 @@ import pekko.actor.typed.ActorSystem
  * The application.conf of your project is not used in this case.
  * A specific configuration can be passed as constructor parameter.
  */
-abstract class ScalaTestWithActorTestKit(testKit: ActorTestKit)
+abstract class ScalaTestWithActorTestKit(override val testKit: ActorTestKit)
     extends ActorTestKitBase(testKit)
-    with TestSuite
-    with Matchers
-    with BeforeAndAfterAll
-    with ScalaFutures
-    with Eventually {
+    with ScalaTestWithActorTestKitBase {
 
   /**
    * Config loaded from `application-test.conf` if that exists, otherwise
@@ -74,6 +70,21 @@ abstract class ScalaTestWithActorTestKit(testKit: 
ActorTestKit)
    */
   def this(config: Config, settings: TestKitSettings) =
     this(ActorTestKit(ActorTestKitBase.testNameFromCallStack(), config, 
settings))
+}
+
+/**
+ * A ScalaTest base trait for the [[ActorTestKit]] which 
[[ScalaTestWithActorTestKit]] extends. If you find yourself in
+ * the situation where you need to extend the same test suite in different 
ways then you can implement your tests within
+ * a trait that extends [[ScalaTestWithActorTestKitBase]].
+ */
+trait ScalaTestWithActorTestKitBase
+    extends TestSuite
+    with Matchers
+    with BeforeAndAfterAll
+    with ScalaFutures
+    with Eventually {
+
+  def testKit: ActorTestKit
 
   /**
    * `PatienceConfig` from 
[[pekko.actor.testkit.typed.TestKitSettings#DefaultTimeout]].
diff --git 
a/actor-testkit-typed/src/test/scala/docs/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestIntegrationExampleSpec.scala
 
b/actor-testkit-typed/src/test/scala/docs/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestIntegrationExampleSpec.scala
index 13d8716340..c48de1aa87 100644
--- 
a/actor-testkit-typed/src/test/scala/docs/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestIntegrationExampleSpec.scala
+++ 
b/actor-testkit-typed/src/test/scala/docs/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestIntegrationExampleSpec.scala
@@ -15,16 +15,19 @@ package docs.org.apache.pekko.actor.testkit.typed.scaladsl
 
 import scala.annotation.nowarn
 import 
docs.org.apache.pekko.actor.testkit.typed.scaladsl.AsyncTestingExampleSpec.Echo
-
+//#extend-multiple-times
 //#log-capturing
 import org.apache.pekko
 import pekko.actor.testkit.typed.scaladsl.LogCapturing
 //#scalatest-integration
 import pekko.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit
-import org.scalatest.wordspec.AnyWordSpecLike
-
 //#scalatest-integration
 //#log-capturing
+import pekko.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKitBase
+//#scalatest-integration
+import org.scalatest.wordspec.AnyWordSpecLike
+//#scalatest-integration
+//#extend-multiple-times
 
 @nowarn
 //#scalatest-integration
@@ -54,3 +57,23 @@ class LogCapturingExampleSpec extends 
ScalaTestWithActorTestKit with AnyWordSpec
   }
 }
 //#log-capturing
+
+//#extend-multiple-times
+
+trait ExtendTestMultipleTimes extends ScalaTestWithActorTestKitBase with 
AnyWordSpecLike with LogCapturing {
+  "ScalaTestWithActorTestKitBase" must {
+    "behave when extended in different ways" in {
+      val pinger = testKit.spawn(Echo(), "ping")
+      val probe = testKit.createTestProbe[Echo.Pong]()
+      val message = this.getClass.getSimpleName
+      pinger ! Echo.Ping(message, probe.ref)
+      val returnedMessage = probe.expectMessage(Echo.Pong(message))
+      returnedMessage.message.contains("ExtendTestMultipleTimes") shouldBe 
false
+    }
+  }
+
+}
+
+class TestWithOneImplementation extends ScalaTestWithActorTestKit with 
ExtendTestMultipleTimes
+class TestWithAnotherImplementation extends ScalaTestWithActorTestKit with 
ExtendTestMultipleTimes
+//#extend-multiple-times
diff --git a/docs/src/main/paradox/typed/testing-async.md 
b/docs/src/main/paradox/typed/testing-async.md
index 304af0e670..43cf984481 100644
--- a/docs/src/main/paradox/typed/testing-async.md
+++ b/docs/src/main/paradox/typed/testing-async.md
@@ -137,6 +137,17 @@ Scala
 Java
 :  @@snip 
[AsyncTestingExampleTest.java](/actor-testkit-typed/src/test/java/jdocs/org/apache/pekko/actor/testkit/typed/javadsl/JunitIntegrationExampleTest.java)
 { #junit-integration }
 
+As you may have noticed 
@scaladoc[ScalaTestWithActorTestKit](pekko.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit)
 is an abstract class
+which means its problematic if you want treat a given test suite as a value 
and extend it in multiple ways (i.e. as an example you happen to be using 
+[testcontainers-scala](https://github.com/testcontainers/testcontainers-scala) 
and hypothetically you want to extend the same test for each different type of 
database
+you support).
+
+If you find yourself in this situation you can instead define your tests 
within a trait that extends 
@scaladoc[ScalaTestWithActorTestKitBase](pekko.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKitBase).
+Since this is a trait you can then have different classes which extend this 
along with 
@scaladoc[ScalaTestWithActorTestKit](pekko.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit).
+
+Scala
+:  @@snip 
[AsyncTestingExampleSpec.scala](/actor-testkit-typed/src/test/scala/docs/org/apache/pekko/actor/testkit/typed/scaladsl/ScalaTestIntegrationExampleSpec.scala)
 { #extend-multiple-times }
+
 ### Configuration
 
 By default the `ActorTestKit` loads configuration from `application-test.conf` 
if that exists, otherwise


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to