Typed testing docs: imports and scalatest dependency (#26890)

This commit is contained in:
Arnout Engelen 2019-05-23 14:05:06 +02:00 committed by GitHub
parent 7815d16e94
commit 3015f197f1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 18 deletions

View file

@ -9,11 +9,15 @@ import akka.actor.typed.ActorRef;
import akka.actor.typed.Behavior; import akka.actor.typed.Behavior;
import akka.actor.typed.javadsl.AskPattern; import akka.actor.typed.javadsl.AskPattern;
import akka.actor.typed.javadsl.Behaviors; import akka.actor.typed.javadsl.Behaviors;
// #test-header
import akka.actor.testkit.typed.javadsl.ActorTestKit; import akka.actor.testkit.typed.javadsl.ActorTestKit;
// #test-header
import akka.actor.testkit.typed.javadsl.TestProbe; import akka.actor.testkit.typed.javadsl.TestProbe;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.junit.Test; import org.junit.Test;
import org.scalatest.junit.JUnitSuite; import org.scalatest.junit.JUnitSuite;
import scala.util.Success; import scala.util.Success;
import scala.util.Try; import scala.util.Try;
@ -26,7 +30,11 @@ import java.util.Objects;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
// #test-header // #test-header
public class AsyncTestingExampleTest extends JUnitSuite { public class AsyncTestingExampleTest
// #test-header
extends JUnitSuite
// #test-header
{
static final ActorTestKit testKit = ActorTestKit.create(); static final ActorTestKit testKit = ActorTestKit.create();
// #test-header // #test-header
@ -183,4 +191,6 @@ public class AsyncTestingExampleTest extends JUnitSuite {
public void systemNameShouldComeFromTestClass() { public void systemNameShouldComeFromTestClass() {
assertEquals(testKit.system().name(), "AsyncTestingExampleTest"); assertEquals(testKit.system().name(), "AsyncTestingExampleTest");
} }
// #test-header
} }
// #test-header

View file

@ -5,14 +5,20 @@
package docs.akka.actor.testkit.typed.scaladsl package docs.akka.actor.testkit.typed.scaladsl
import akka.actor.Scheduler import akka.actor.Scheduler
//#test-header
import akka.actor.testkit.typed.scaladsl.ActorTestKit import akka.actor.testkit.typed.scaladsl.ActorTestKit
//#test-header
import akka.actor.typed._ import akka.actor.typed._
import akka.actor.typed.scaladsl.AskPattern._ import akka.actor.typed.scaladsl.AskPattern._
import akka.actor.typed.scaladsl.Behaviors import akka.actor.typed.scaladsl.Behaviors
import akka.util.Timeout import akka.util.Timeout
//#test-header
import org.scalatest.BeforeAndAfterAll import org.scalatest.BeforeAndAfterAll
import org.scalatest.Matchers import org.scalatest.Matchers
import org.scalatest.WordSpec import org.scalatest.WordSpec
//#test-header
import scala.concurrent.duration._ import scala.concurrent.duration._
import scala.concurrent.Future import scala.concurrent.Future
@ -124,4 +130,6 @@ class AsyncTestingExampleSpec extends WordSpec with BeforeAndAfterAll with Match
//#test-shutdown //#test-shutdown
override def afterAll(): Unit = testKit.shutdownTestKit() override def afterAll(): Unit = testKit.shutdownTestKit()
//#test-shutdown //#test-shutdown
//#test-header
} }
//#test-header

View file

@ -11,14 +11,27 @@ To use Akka TestKit Typed, add the module to your project:
scope=test scope=test
} }
@@@div { .group-scala }
We recommend using Akka TestKit Typed with ScalaTest:
@@dependency[sbt,Maven,Gradle] {
group=org.scalatest
artifact=scalatest_$scala.binary_version$
version=$scalatest.version$
scope=test
}
@@@
## Introduction ## Introduction
Testing can either be done asynchronously using a real `ActorSystem` or synchronously on the testing thread using the `BehaviourTestKit`. Testing can either be done asynchronously using a real @apidoc[akka.actor.typed.ActorSystem] or synchronously on the testing thread using the @apidoc[BehaviorTestKit].
For testing logic in a `Behavior` in isolation synchronous testing is preferred. For testing interactions between multiple For testing logic in a @apidoc[Behavior] in isolation synchronous testing is preferred. For testing interactions between multiple
actors a more realistic asynchronous test is preferred. actors a more realistic asynchronous test is preferred.
Certain `Behavior`s will be hard to test synchronously e.g. if they spawn Future's and you rely on a callback to complete Certain @apidoc[Behavior]s will be hard to test synchronously e.g. if they spawn Future's and you rely on a callback to complete
before observing the effect you want to test. Further support for controlling the scheduler and execution context used before observing the effect you want to test. Further support for controlling the scheduler and execution context used
will be added. will be added.
@ -64,8 +77,8 @@ Scala
Java Java
: @@snip [SyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/SyncTestingExampleTest.java) { #child } : @@snip [SyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/SyncTestingExampleTest.java) { #child }
All of the tests make use of the `BehaviorTestkit` to avoid the need for a real `ActorContext`. Some of the tests All of the tests make use of the @apidoc[BehaviorTestKit] to avoid the need for a real `ActorContext`. Some of the tests
make use of the `TestInbox` which allows the creation of an `ActorRef` that can be used for synchronous testing, similar to the make use of the @apidoc[TestInbox] which allows the creation of an @apidoc[akka.actor.typed.ActorRef] that can be used for synchronous testing, similar to the
`TestProbe` used for asynchronous testing. `TestProbe` used for asynchronous testing.
@ -89,7 +102,7 @@ Java
### Sending messages ### Sending messages
For testing sending a message a `TestInbox` is created that provides an `ActorRef` and methods to assert against the For testing sending a message a @apidoc[TestInbox] is created that provides an @apidoc[akka.actor.typed.ActorRef] and methods to assert against the
messages that have been sent to it. messages that have been sent to it.
Scala Scala
@ -98,8 +111,8 @@ Scala
Java Java
: @@snip [SyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/SyncTestingExampleTest.java) { #test-message } : @@snip [SyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/SyncTestingExampleTest.java) { #test-message }
Another use case is sending a message to a child actor you can do this by looking up the 'TestInbox' for Another use case is sending a message to a child actor you can do this by looking up the @apidoc[TestInbox] for
a child actor from the 'BehaviorTestKit': a child actor from the @apidoc[BehaviorTestKit]:
Scala Scala
: @@snip [SyncTestingExampleSpec.scala](/akka-actor-testkit-typed/src/test/scala/docs/akka/actor/testkit/typed/scaladsl/SyncTestingExampleSpec.scala) { #test-child-message } : @@snip [SyncTestingExampleSpec.scala](/akka-actor-testkit-typed/src/test/scala/docs/akka/actor/testkit/typed/scaladsl/SyncTestingExampleSpec.scala) { #test-child-message }
@ -117,7 +130,7 @@ Java
### Testing other effects ### Testing other effects
The `BehaviorTestkit` keeps track other effects you can verify, look at the sub-classes of `akka.actor.testkit.typed.Effect` The @apidoc[BehaviorTestKit] keeps track other effects you can verify, look at the sub-classes of @apidoc[akka.actor.testkit.typed.Effect]
* SpawnedAdapter * SpawnedAdapter
* Stopped * Stopped
@ -127,7 +140,7 @@ The `BehaviorTestkit` keeps track other effects you can verify, look at the sub-
### Checking for Log Messages ### Checking for Log Messages
The `BehaviorTestkit` also keeps track of everything that is being logged. Here, you can see an example on how to check The @apidoc[BehaviorTestKit] also keeps track of everything that is being logged. Here, you can see an example on how to check
if the behavior logged certain messages: if the behavior logged certain messages:
Scala Scala
@ -137,11 +150,11 @@ Java
: @@snip [SyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/SyncTestingExampleTest.java) { #test-check-logging } : @@snip [SyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/SyncTestingExampleTest.java) { #test-check-logging }
See the other public methods and API documentation on `BehaviorTestkit` for other types of verification. See the other public methods and API documentation on @apidoc[BehaviorTestKit] for other types of verification.
## Asynchronous testing ## Asynchronous testing
Asynchronous testing uses a real `ActorSystem` that allows you to test your Actors in a more realistic environment. Asynchronous testing uses a real @apidoc[akka.actor.typed.ActorSystem] that allows you to test your Actors in a more realistic environment.
The minimal setup consists of the test procedure, which provides the desired stimuli, the actor under test, The minimal setup consists of the test procedure, which provides the desired stimuli, the actor under test,
and an actor receiving replies. Bigger systems replace the actor under test with a network of actors, apply stimuli and an actor receiving replies. Bigger systems replace the actor under test with a network of actors, apply stimuli
@ -158,7 +171,7 @@ Scala
Java Java
: @@snip [AsyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/AsyncTestingExampleTest.java) { #under-test } : @@snip [AsyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/AsyncTestingExampleTest.java) { #under-test }
Tests create an instance of `ActorTestKit`. This provides access to: Tests create an instance of @apidoc[ActorTestKit]. This provides access to:
* An ActorSystem * An ActorSystem
* Methods for spawning Actors. These are created under the root guardian * Methods for spawning Actors. These are created under the root guardian
@ -170,7 +183,7 @@ Scala
Java Java
: @@snip [AsyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/AsyncTestingExampleTest.java) { #test-header } : @@snip [AsyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/AsyncTestingExampleTest.java) { #test-header }
Your test is responsible for shutting down the `ActorSystem` e.g. using @scala[`BeforeAndAfterAll` when using ScalaTest]@java[`@AfterClass` when using JUnit]. Your test is responsible for shutting down the @apidoc[akka.actor.typed.ActorSystem] e.g. using @scala[`BeforeAndAfterAll` when using ScalaTest]@java[`@AfterClass` when using JUnit].
Scala Scala
: @@snip [AsyncTestingExampleSpec.scala](/akka-actor-testkit-typed/src/test/scala/docs/akka/actor/testkit/typed/scaladsl/AsyncTestingExampleSpec.scala) { #test-shutdown } : @@snip [AsyncTestingExampleSpec.scala](/akka-actor-testkit-typed/src/test/scala/docs/akka/actor/testkit/typed/scaladsl/AsyncTestingExampleSpec.scala) { #test-shutdown }
@ -210,7 +223,7 @@ Scala
Java Java
: @@snip [AsyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/AsyncTestingExampleTest.java) { #test-stop-actors } : @@snip [AsyncTestingExampleTest.java](/akka-actor-testkit-typed/src/test/java/jdocs/akka/actor/testkit/typed/javadsl/AsyncTestingExampleTest.java) { #test-stop-actors }
The `stop` method can only be used for actors that were spawned by the same `ActorTestKit`. Other actors The `stop` method can only be used for actors that were spawned by the same @apidoc[ActorTestKit]. Other actors
will not be stopped by that method. will not be stopped by that method.
### Observing mocked behavior ### Observing mocked behavior
@ -243,7 +256,7 @@ Java
@@@ div { .group-java } @@@ div { .group-java }
If you are using JUnit you can use `akka.actor.testkit.typed.javadsl.TestKitJunitResource` to have the async test kit automatically If you are using JUnit you can use @apidoc[akka.actor.testkit.typed.javadsl.TestKitJunitResource] to have the async test kit automatically
shutdown when the test is complete. shutdown when the test is complete.
Note that the dependency on JUnit is marked as optional from the test kit module, so your project must explicitly include Note that the dependency on JUnit is marked as optional from the test kit module, so your project must explicitly include
@ -253,7 +266,7 @@ a dependency on JUnit to use this.
@@@ div { .group-scala } @@@ div { .group-scala }
If you are using ScalaTest you can extend `akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit` to If you are using ScalaTest you can extend @apidoc[akka.actor.testkit.typed.scaladsl.ScalaTestWithActorTestKit] to
have the async test kit automatically shutdown when the test is complete. This is done in `afterAll` from have the async test kit automatically shutdown when the test is complete. This is done in `afterAll` from
the `BeforeAndAfterAll` trait. If you override that method you should call `super.afterAll` to shutdown the the `BeforeAndAfterAll` trait. If you override that method you should call `super.afterAll` to shutdown the
test kit. test kit.

View file

@ -211,6 +211,7 @@ lazy val docs = akkaModule("akka-docs")
"scala.version" -> scalaVersion.value, "scala.version" -> scalaVersion.value,
"scala.binary_version" -> scalaBinaryVersion.value, "scala.binary_version" -> scalaBinaryVersion.value,
"akka.version" -> version.value, "akka.version" -> version.value,
"scalatest.version" -> Dependencies.scalaTestVersion.value,
"sigar_loader.version" -> "1.6.6-rev002", "sigar_loader.version" -> "1.6.6-rev002",
"algolia.docsearch.api_key" -> "543bad5ad786495d9ccd445ed34ed082", "algolia.docsearch.api_key" -> "543bad5ad786495d9ccd445ed34ed082",
"algolia.docsearch.index_name" -> "akka_io", "algolia.docsearch.index_name" -> "akka_io",