Scala 同步测试类型转换器
有没有办法使我的TypedActor调用同步?我正在寻找一些解决方案,如TestActorRef,用于传统参与者。我尝试了Scala 同步测试类型转换器,scala,akka,Scala,Akka,有没有办法使我的TypedActor调用同步?我正在寻找一些解决方案,如TestActorRef,用于传统参与者。我尝试了.withDispatcher(callingReadDispatcher.Id),但它的工作方式是不确定的 示例: import akka.actor.{TypedActor, ActorSystem, TypedProps} import akka.testkit.CallingThreadDispatcher import org.mockito.Mockito imp
.withDispatcher(callingReadDispatcher.Id)
,但它的工作方式是不确定的
示例:
import akka.actor.{TypedActor, ActorSystem, TypedProps}
import akka.testkit.CallingThreadDispatcher
import org.mockito.Mockito
import org.scalatest.{BeforeAndAfterAll, WordSpec}
class FooTest extends WordSpec with BeforeAndAfterAll{
trait Foo {
def foo():Unit
}
class Bar {
def bar():String = "bar"
}
class FooActor(bar: Bar) extends Foo {
override def foo(): Unit = println(bar.bar())
}
val barSpy = Mockito.spy(new Bar)
val typedProps = TypedProps(classOf[Foo], new FooActor(barSpy)).withDispatcher(CallingThreadDispatcher.Id)
val actorSystem = ActorSystem("FooTest")
"FooActor" should {
"call Bar#bar() when foo is called" in {
val fooActor : Foo = TypedActor(actorSystem).typedActorOf(typedProps)
fooActor.foo()
Mockito.verify(barSpy).bar()
}
}
override protected def afterAll(): Unit = actorSystem.shutdown()
}
运行两次,给出正面和负面的结果不确定我是否完全理解您,但您可以使用expectMSG方法保持到演员完成为止
case class Greeting(msg:String)
class FooActor(replyTo: ActorRef) extends Actor{
def receive = {
case Message(m) => replyTo ! Message("Hello "+m)
}
}
"Greetings must be sent in a particular order" in{
val foo = system.actorOf(Props(new FooActor()), "foo")
foo ! Greeting("Sir")
expectMsg(Greeting("Hello Sir"))
filter ! "bla bla" //not a Greeting
expectNoMsg
foo ! Greeting("Foo")
foo ! Greeting("Bar")
expectMsg(Greeting("Hello Foo"))
expectMsg(Greeting("Hello Bar"))
}
expectMsg和expectNoMsg等待参与者完成或超时
如果不想将actorRef用作Actor类(即replayTo)的参数,可以使用intercept,但需要确保在测试中使用单线程环境
大概是这样的:
val foo = system.actorOf(Props[Foo].withDispatcher(CallingThreadDispatcher.Id) )
我找到了一些解决办法。不完美但可用
trait TestFoo {
def foo_Sync() :Int
}
class TestFooActor extends FooActor with TestFoo {
def foo_Sync() :Int = {super.foo();1}
}
我们在测试中使用这个特性而不是Foo。返回值使此调用同步。所谓同步,是指“让它在与调用方相同的线程中执行工作?”我认为如果您能提供一些代码示例、您期望的内容以及为什么分派到不同线程会有问题,可能会有所帮助。所谓同步,是指以调用它们的相同顺序执行操作(在所有对象上,而不仅仅是参与者),就像传统方法一样。我的问题是mock,它的调用无法验证,因为前一次是ok的,下一次它说该方法没有被调用。是否清楚,或者我应该提供一些示例?我假设你的类型化actor调用没有被你的mock库返回单元调用?类型化actor代理对象和你的mock应该实现相同的接口;为什么不直接为要使用的代码提供mock,而不是一个类型化的actor?您的代码不应该更明智。我为actor提供mock,我调用actor,actor调用mock,我验证是否调用了mock。我将在几个小时内提供示例。但整个过程都是关于TypedActor的,而不是传统艾尔