Scala 同步测试类型转换器

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

有没有办法使我的TypedActor调用同步?我正在寻找一些解决方案,如TestActorRef,用于传统参与者。我尝试了
.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的,而不是传统艾尔