如何使用ScalaTest在Akka Actor中使用外部调用进行模拟

时间:2015-05-26 22:51:59

标签: scala akka mockito scalatest akka-testkit

我是整个生态系统的新手,包括AkkaScalaTestActor

我正在解决我的case object LogProcessRequest class LProcessor extends Actor { val log = Logging(context.system, this) def receive = { case LogProcessRequest => log.debug("starting log processing") LogReaderDisruptor main(Array()) } } 给外部系统打电话的问题。

LogReaderDisruptor main(Array())

Java是一个class LProcessorSpec extends UnitTestSpec("testSystem") { "A mocked log processor" should { "be called" in { val logProcessorActor = system.actorOf(Props[LProcessor]) logProcessorActor ! LogProcessRequest } } } 类,可以执行许多其他操作。

我目前的测试似乎是

UnitTestSpec

import akka.actor.ActorSystem import akka.testkit.{ImplicitSender, TestKit} import org.scalatest.matchers.MustMatchers import org.scalatest.{BeforeAndAfterAll, WordSpecLike} abstract class UnitTestSpec(name: String) extends TestKit(ActorSystem(name)) with WordSpecLike with MustMatchers with BeforeAndAfterAll with ImplicitSender { override def afterAll() { system.shutdown() } } 看起来像(并且受到here的启发)

LogReaderDisruptor main(Array())

问题

  • 如何模拟对Java的调用并验证它是否被调用?

我来自JUnitMockitodoNothing().when(logReaderDisruptor).main(Matchers.<String>anyVararg()) verify(logReaderDisruptor, times(1)).main(Matchers.<String>anyVararg()) 土地和我本来会做的事情

recip

我不知道如何在这里使用ScalaTest进行翻译。

此外,这段代码可能不是惯用的,因为我很新并且学习

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点。 OO方式的一种方式是将logDisrupter包装为一个对象并将其传入。我将设置一个伴随对象来实例化actor。像下面的东西。然后你可以通过备用实现。您也可以通过仅在需要时使用特征和混合替代logDisrupter来实现类似的方法。

object LProcessor {
   def props(logDisrupter : LogDisrupter) = Props(new LProcessor(logDisrupter))
}

class LProcessor(logDisrupter : LogDisrupter) extends Actor {
  val log = Logging(context.system, this)

  def receive = {
    case LogProcessRequest =>
      log.debug("starting log processing")
      logDisrupter.doSomething();
  }
}

然后设置为

val logProcessorActor = system.actorOf(LProcessor.props(logDisrupter))