+tes #16431 support for TestProbe with user-defined name

This commit is contained in:
Paweł Wiejacha 2014-12-04 22:42:40 +01:00
parent 49d9082851
commit f480989b25
6 changed files with 55 additions and 6 deletions

View file

@ -285,6 +285,19 @@ public class TestKitDocTest {
//#test-probe //#test-probe
} }
@Test
public void demonstrateTestProbeWithCustomName() {
//#test-probe-with-custom-name
new JavaTestKit(system) {{
final TestProbe worker = new TestProbe(system, "worker");
final TestProbe aggregator = new TestProbe(system, "aggregator");
assertTrue(worker.ref().path().name().startsWith("worker"));
assertTrue(aggregator.ref().path().name().startsWith("aggregator"));
}};
//#test-probe-with-custom-name
}
@Test @Test
public void demonstrateSpecialProbe() { public void demonstrateSpecialProbe() {
//#test-special-probe //#test-special-probe

View file

@ -388,6 +388,11 @@ flow, a :class:`TestProbe` could be inserted as target of A, using the
forwarding capabilities or auto-pilot described below to include a real B in forwarding capabilities or auto-pilot described below to include a real B in
the test setup. the test setup.
If you have many test probes, you can name them to get meaningful actor names
in test logs and assertions:
.. includecode:: code/docs/testkit/TestKitDocTest.java#test-probe-with-custom-name
Probes may also be equipped with custom assertions to make your test code even Probes may also be equipped with custom assertions to make your test code even
more concise and clear: more concise and clear:

View file

@ -211,6 +211,16 @@ class TestkitDocSpec extends AkkaSpec with DefaultTimeout with ImplicitSender {
//#test-special-probe //#test-special-probe
} }
"demonstrate usage of test probe with custom name" in {
//#test-probe-with-custom-name
val worker = TestProbe("worker")
val aggregator = TestProbe("aggregator")
worker.ref.path.name should startWith("worker")
aggregator.ref.path.name should startWith("aggregator")
//#test-probe-with-custom-name
}
"demonstrate probe watch" in { "demonstrate probe watch" in {
import akka.testkit.TestProbe import akka.testkit.TestProbe
val target = system.actorOf(Props.empty) val target = system.actorOf(Props.empty)

View file

@ -443,6 +443,11 @@ message flow, a :class:`TestProbe` could be inserted as target of A, using the
forwarding capabilities or auto-pilot described below to include a real B in forwarding capabilities or auto-pilot described below to include a real B in
the test setup. the test setup.
If you have many test probes, you can name them to get meaningful actor names
in test logs and assertions:
.. includecode:: code/docs/testkit/TestkitDocSpec.scala#test-probe-with-custom-name
Probes may also be equipped with custom assertions to make your test code even Probes may also be equipped with custom assertions to make your test code even
more concise and clear: more concise and clear:

View file

@ -116,6 +116,11 @@ trait TestKitBase {
def lastSender = lastMessage.sender def lastSender = lastMessage.sender
/**
* Defines the testActor name.
*/
protected def testActorName: String = "testActor"
/** /**
* ActorRef of the test actor. Access is provided to enable e.g. * ActorRef of the test actor. Access is provided to enable e.g.
* registration as message target. * registration as message target.
@ -124,7 +129,7 @@ trait TestKitBase {
val impl = system.asInstanceOf[ExtendedActorSystem] val impl = system.asInstanceOf[ExtendedActorSystem]
val ref = impl.systemActorOf(TestActor.props(queue) val ref = impl.systemActorOf(TestActor.props(queue)
.withDispatcher(CallingThreadDispatcher.Id), .withDispatcher(CallingThreadDispatcher.Id),
"testActor" + TestKit.testActorId.incrementAndGet) "%s-%d".format(testActorName, TestKit.testActorId.incrementAndGet))
awaitCond(ref match { awaitCond(ref match {
case r: RepointableRef r.isStarted case r: RepointableRef r.isStarted
case _ true case _ true
@ -787,13 +792,17 @@ object TestKit {
/** /**
* TestKit-based probe which allows sending, reception and reply. * TestKit-based probe which allows sending, reception and reply.
*/ */
class TestProbe(_application: ActorSystem) extends TestKit(_application) { class TestProbe(_application: ActorSystem, name: String) extends TestKit(_application) {
def this(_application: ActorSystem) = this(_application, "testProbe")
/** /**
* Shorthand to get the testActor. * Shorthand to get the testActor.
*/ */
def ref = testActor def ref = testActor
protected override def testActorName = name
/** /**
* Send message to an actor while using the probe's TestActor as the sender. * Send message to an actor while using the probe's TestActor as the sender.
* Replies will be available for inspection with all of TestKit's assertion * Replies will be available for inspection with all of TestKit's assertion
@ -820,6 +829,7 @@ class TestProbe(_application: ActorSystem) extends TestKit(_application) {
object TestProbe { object TestProbe {
def apply()(implicit system: ActorSystem) = new TestProbe(system) def apply()(implicit system: ActorSystem) = new TestProbe(system)
def apply(name: String)(implicit system: ActorSystem) = new TestProbe(system, name)
} }
trait ImplicitSender { this: TestKitBase trait ImplicitSender { this: TestKitBase

View file

@ -2,11 +2,8 @@ package akka.testkit
import language.postfixOps import language.postfixOps
import org.scalatest.WordSpec
import org.scalatest.Matchers
import org.scalatest.{ BeforeAndAfterEach, WordSpec }
import akka.actor._ import akka.actor._
import scala.concurrent.{ Future, Await } import scala.concurrent.{ Await }
import scala.concurrent.duration._ import scala.concurrent.duration._
import akka.pattern.ask import akka.pattern.ask
import scala.util.Try import scala.util.Try
@ -132,6 +129,15 @@ class TestProbeSpec extends AkkaSpec with DefaultTimeout {
probe.expectMsg(1.seconds, Terminated(target)(false, false)) probe.expectMsg(1.seconds, Terminated(target)(false, false))
} }
"allow user-defined name" in {
val probe = TestProbe("worker")
probe.ref.path.name should startWith("worker")
}
"have reasonable default name" in {
val probe = new TestProbe(system)
probe.ref.path.name should startWith("testProbe")
}
} }
} }