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]